distributed device speakers: berlemont samuel management...

54
Distributed Device Management for IoT In action with Eclipse Leshan, Eclipse Wakaama and OMA- LWM2M Speakers: BERLEMONT Samuel MICHE Arnaud Orange Labs IoT Research Domain 19/02/2019 Eclipse IoT Days, Grenoble

Upload: others

Post on 25-May-2020

4 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Distributed Device Speakers: BERLEMONT Samuel Management …wiki.eclipse.org/images/1/1c/EclipseIoTDayGrenoble2019... · 2019-02-20 · Distributed Device Management for IoT In action

Distributed Device Management for IoT In action with Eclipse Leshan, Eclipse Wakaama and OMA-LWM2M

Speakers:

BERLEMONT Samuel

MICHE Arnaud

Orange Labs

IoT Research Domain

19/02/2019 Eclipse IoT Days, Grenoble

Page 2: Distributed Device Speakers: BERLEMONT Samuel Management …wiki.eclipse.org/images/1/1c/EclipseIoTDayGrenoble2019... · 2019-02-20 · Distributed Device Management for IoT In action

2 Externe Orange

1. Device Management?

2. Standards and best practices

3. DM for IoT, a new paradigm

4. The Future of DM: a multi-server architecture

5. Next Steps

Outline

Page 3: Distributed Device Speakers: BERLEMONT Samuel Management …wiki.eclipse.org/images/1/1c/EclipseIoTDayGrenoble2019... · 2019-02-20 · Distributed Device Management for IoT In action

3 Externe Orange

Device Management… ?

Page 4: Distributed Device Speakers: BERLEMONT Samuel Management …wiki.eclipse.org/images/1/1c/EclipseIoTDayGrenoble2019... · 2019-02-20 · Distributed Device Management for IoT In action

4 Externe Orange

4 categories of operations

Tracking

Maintenance Assistance

Provisioning

Security

• Error and log collection for analysis

• Firmware update

• Remote service activation and configuration

• Configuration visualization • Diagnostics • Remote actions (reboot…)

Page 5: Distributed Device Speakers: BERLEMONT Samuel Management …wiki.eclipse.org/images/1/1c/EclipseIoTDayGrenoble2019... · 2019-02-20 · Distributed Device Management for IoT In action

5 Externe Orange

Standards and Best Practices

Page 6: Distributed Device Speakers: BERLEMONT Samuel Management …wiki.eclipse.org/images/1/1c/EclipseIoTDayGrenoble2019... · 2019-02-20 · Distributed Device Management for IoT In action

6 Externe Orange

CPE WAN Management Protocol v1.4, Issue: 1 amendement 6

Centralized Auto-Configuration Server

Data models

RPC Methods device / server (HTTP/SOAP)

Page 7: Distributed Device Speakers: BERLEMONT Samuel Management …wiki.eclipse.org/images/1/1c/EclipseIoTDayGrenoble2019... · 2019-02-20 · Distributed Device Management for IoT In action

7 Externe Orange

User Services Platform V1.0

Multi-controller architecture

Data models w/ methods RESTful Full discovery

Service elements / Proxies

Start of Open Source activities

Page 8: Distributed Device Speakers: BERLEMONT Samuel Management …wiki.eclipse.org/images/1/1c/EclipseIoTDayGrenoble2019... · 2019-02-20 · Distributed Device Management for IoT In action

8 Externe Orange

Multi-server architecture Data models w/ methods RESTful Shared models Service objects (OMNA, IPSO) / Proxies Dynamic ecosystem

• Open Source implementations (Wakaama, Leshan, …)

OMA Lightweight M2M

Page 9: Distributed Device Speakers: BERLEMONT Samuel Management …wiki.eclipse.org/images/1/1c/EclipseIoTDayGrenoble2019... · 2019-02-20 · Distributed Device Management for IoT In action

9 Externe Orange

Bootstrapping

Device

Configuration

Device

Management

Firmware

Update

Fault

Management

Service

Enablement

(Application)

Configuration

& Control

Reporting

SAS – OMA Lightweight M2M (LwM2M) Overview – 12/2016

OMA Lightweight M2M : Device Management & Service Enablement Standard for IoT

Page 10: Distributed Device Speakers: BERLEMONT Samuel Management …wiki.eclipse.org/images/1/1c/EclipseIoTDayGrenoble2019... · 2019-02-20 · Distributed Device Management for IoT In action

10 Externe Orange

DM for IoT, a new paradigm

Page 11: Distributed Device Speakers: BERLEMONT Samuel Management …wiki.eclipse.org/images/1/1c/EclipseIoTDayGrenoble2019... · 2019-02-20 · Distributed Device Management for IoT In action

11 Externe Orange

IoT DM challenges

• Heterogeneity

life-cycle profiles

DM features

• Security

• New architectures

DM/service convergence

Multi-protocol management

Softwarization : NFV, SDN

• Scalability

Page 12: Distributed Device Speakers: BERLEMONT Samuel Management …wiki.eclipse.org/images/1/1c/EclipseIoTDayGrenoble2019... · 2019-02-20 · Distributed Device Management for IoT In action

12 Externe Orange

The impact on DM solutions

Device profiles

Requirements

Corresponding

DM/SM protocol

Multiple relevant Standards

& Proprietary protocols

Page 13: Distributed Device Speakers: BERLEMONT Samuel Management …wiki.eclipse.org/images/1/1c/EclipseIoTDayGrenoble2019... · 2019-02-20 · Distributed Device Management for IoT In action

13 Externe Orange

The impact on DM solutions

Multi-protocol DM solution

Integration of additional DM servers

Integration of non-DM-enabled devices

Page 14: Distributed Device Speakers: BERLEMONT Samuel Management …wiki.eclipse.org/images/1/1c/EclipseIoTDayGrenoble2019... · 2019-02-20 · Distributed Device Management for IoT In action

Distributed Device Management for IoTIn action with Eclipse Leshan, Eclipse Wakaama and OMA-LWM2M

Imagined by the research team working for Orange Labs IoT Research Domain

« Under the hood »

Page 15: Distributed Device Speakers: BERLEMONT Samuel Management …wiki.eclipse.org/images/1/1c/EclipseIoTDayGrenoble2019... · 2019-02-20 · Distributed Device Management for IoT In action

Who am I ? Arnaud MICHÉ

Software developer at OBS SA (subsidiary of Orange SA)

My job on this project :Implement prototypes in order to evaluate the ideas and theories envisionned by the research team.

Page 16: Distributed Device Speakers: BERLEMONT Samuel Management …wiki.eclipse.org/images/1/1c/EclipseIoTDayGrenoble2019... · 2019-02-20 · Distributed Device Management for IoT In action

Contents • Why Leshan ?• How we used it• Proxies

• How a proxy work• Changes in leshan-client-demo

• Servers• How a server works• Changes in leshan-server-cluster

• Wakaama on ESP32• How it is integrated in the demonstration• Near future work

Page 17: Distributed Device Speakers: BERLEMONT Samuel Management …wiki.eclipse.org/images/1/1c/EclipseIoTDayGrenoble2019... · 2019-02-20 · Distributed Device Management for IoT In action

Why ?

1. Major goals Decentralized Multi server

Lwm2m seemsTo be a good

candidate for this job

Lwm2m seemsTo be a good

candidate for this job

2. Need of an implementation for our experiments

3. Leshan is mature, in active development and provides good examples ...

We can startOur prototypeWith confidence

We can startOur prototypeWith confidence

Page 18: Distributed Device Speakers: BERLEMONT Samuel Management …wiki.eclipse.org/images/1/1c/EclipseIoTDayGrenoble2019... · 2019-02-20 · Distributed Device Management for IoT In action

Contents • Why Leshan ?• How we used it• Proxies• Servers• Wakaama on ESP32• How it is integrated in the demonstration• Near future work

Page 19: Distributed Device Speakers: BERLEMONT Samuel Management …wiki.eclipse.org/images/1/1c/EclipseIoTDayGrenoble2019... · 2019-02-20 · Distributed Device Management for IoT In action

How we use Disclaimer:

The code base used for our prototype has been cloned in september 2017 and did not follow the changes of upstream developments since this date.

2. As a proxy for connecting constrained devices to our DM network.

1. As a server of Device Management (DM) ready to be clustered in our network.

Page 20: Distributed Device Speakers: BERLEMONT Samuel Management …wiki.eclipse.org/images/1/1c/EclipseIoTDayGrenoble2019... · 2019-02-20 · Distributed Device Management for IoT In action

v1

How we use

3. For now, only Firmware Upgrade is implemented in the Proof-of-Concept.

v2

Page 21: Distributed Device Speakers: BERLEMONT Samuel Management …wiki.eclipse.org/images/1/1c/EclipseIoTDayGrenoble2019... · 2019-02-20 · Distributed Device Management for IoT In action

Contents • Why Leshan ?• How we used it• Proxies• Servers• Wakaama on ESP32• How it is integrated in the demonstration• Near future work

Page 22: Distributed Device Speakers: BERLEMONT Samuel Management …wiki.eclipse.org/images/1/1c/EclipseIoTDayGrenoble2019... · 2019-02-20 · Distributed Device Management for IoT In action

Proxies

Non-LWM2M butWifi or BT

Non-LWM2M butWifi or BT LWM2M serverLWM2M server

• Based on leshan-client-demo package provided with Leshan sources

• Addition of an Avahi service for device over TCP (here, via WiFi)• Addition of a service polling serial connections for Bluetooth device

connected via an USB dongle• Process wrapper for launching tools for flashing device

Page 23: Distributed Device Speakers: BERLEMONT Samuel Management …wiki.eclipse.org/images/1/1c/EclipseIoTDayGrenoble2019... · 2019-02-20 · Distributed Device Management for IoT In action

How a proxy manager works

g-esp32-<id> g-proxy-<id>

g-airboard-<id>

serial

New lwm2m client :g-proxy-<id>/g-esp32-<id>

New lwm2m client :g-proxy-<id>/g-airboard-<id>

Page 24: Distributed Device Speakers: BERLEMONT Samuel Management …wiki.eclipse.org/images/1/1c/EclipseIoTDayGrenoble2019... · 2019-02-20 · Distributed Device Management for IoT In action

Changes on leshan-client-demo

MyDevice

BaseInstanceEnabler

From the package leshan.client.resource

In order to address several types of devices.Here, BT and WiFi devices

AbstractDevice

BaseInstanceEnabler

SerialDevice AvahiDevice

Page 25: Distributed Device Speakers: BERLEMONT Samuel Management …wiki.eclipse.org/images/1/1c/EclipseIoTDayGrenoble2019... · 2019-02-20 · Distributed Device Management for IoT In action

Changes on leshan-client-demo

AvahiMonitor

In order to connect WiFi and BT devices

BlunoMonitor

libavahi4j

TCP connection monitoring service

WiFi connection

Serial connection monitoring service

USB dongle connection

LWM2M client creationLWM2M registration

Page 26: Distributed Device Speakers: BERLEMONT Samuel Management …wiki.eclipse.org/images/1/1c/EclipseIoTDayGrenoble2019... · 2019-02-20 · Distributed Device Management for IoT In action

Changes on leshan-client-demoIn order to perform the firmware update (1/2)

JavaExecutor

Executor

LoaderExecutor ArduinoExecutorAvrLoaderExecutor

A kind of Process wrapper

Execute a JAR

Launch the tool for flashing a binary file to the esp32

Launch an Arduino build for a given INO file (available for a zipped INO project, also)

Launch avrdude for flashing a binary file on an Avr device

Page 27: Distributed Device Speakers: BERLEMONT Samuel Management …wiki.eclipse.org/images/1/1c/EclipseIoTDayGrenoble2019... · 2019-02-20 · Distributed Device Management for IoT In action

Changes on leshan-client-demo

MyFirmwareUpdate

FirmwareDescriptor

• The LWM2M object « Firmware »• It is also in charge of downloading the firmware

and launch the execution of the flash tool (by intermediate of the Executors)

• It holds informations necessary to the firmware update : Version of software url where to download the file format of the file and the type of the board

enabling the choice of the right executor for flashing the device.

In order to perform the firmware update (2/2)

Page 28: Distributed Device Speakers: BERLEMONT Samuel Management …wiki.eclipse.org/images/1/1c/EclipseIoTDayGrenoble2019... · 2019-02-20 · Distributed Device Management for IoT In action

Changes on leshan-client-demoIn order to allow multiserver (1/2)

private static String serverURI_1 = "coap://192.168.0.100:5683";private static String serverURI_2 = "coap://192.168.0.101:5683";

Declaration of two server URLs inside LeshanClientDemo.java :1.

Security sec1 = Security.noSec(serverURI_1, 123);Security sec2 = Security.noSec(serverURI_2, 234);

Server serv1 = new Server(123, 30, BindingMode.U, false);Server serv2 = new Server(234, 30, BindingMode.U, false);

initializer.setInstancesForObject(SECURITY, sec1, sec2);initializer.setInstancesForObject(SERVER, serv1, serv2);

2.

Page 29: Distributed Device Speakers: BERLEMONT Samuel Management …wiki.eclipse.org/images/1/1c/EclipseIoTDayGrenoble2019... · 2019-02-20 · Distributed Device Management for IoT In action

Changes on leshan-client-demoIn order to allow multiserver (2/2)

Some changes in LWM2M Registration related classes of Leshan core :

2. Inside leshan-client-cf/src/main/java/org/eclipse/leshan/client/californium/LeshanClient.java

Added a function getRegistrationId which calls the getRegistrationId of the RegistrationEngine with the server informations. Server informations passed in parameters enable to retrieve the registration Id of a device giving its server Id.

1. Inside leshan-master_bluno/leshan-client-core/src/main/java/org/eclipse/leshan/client/servers/RegistrationEngine.java

Changed data structure which holds the registration ID for one client from a variable storing the reg_id to a hash map which holds several couples (server_uri, reg_id) as a client can be registered to more than one server.

Page 30: Distributed Device Speakers: BERLEMONT Samuel Management …wiki.eclipse.org/images/1/1c/EclipseIoTDayGrenoble2019... · 2019-02-20 · Distributed Device Management for IoT In action

Contents • Why Leshan ?• How we used it• Proxies• Servers• Wakaama on ESP32• How it is integrated in the demonstration• Near future work

Page 31: Distributed Device Speakers: BERLEMONT Samuel Management …wiki.eclipse.org/images/1/1c/EclipseIoTDayGrenoble2019... · 2019-02-20 · Distributed Device Management for IoT In action

Servers

• Based on leshan-server-cluster package provided with Leshan sources

• Manage registered devices• Relying on Redis PubSub• Reg IDs stored in Redis Key/Value data base

FirmwareUpdate

GetParameter

SetParameter

Page 32: Distributed Device Speakers: BERLEMONT Samuel Management …wiki.eclipse.org/images/1/1c/EclipseIoTDayGrenoble2019... · 2019-02-20 · Distributed Device Management for IoT In action

How a server works

Redis Pub/Sub

Redis DB

Server start !

Store server Id

Client registered !

Store regId andregistration infos

Same path for update and deregistration of the device.

Same path for the server stop event.Note: a hook has been added for notifying the stop of the server.

Page 33: Distributed Device Speakers: BERLEMONT Samuel Management …wiki.eclipse.org/images/1/1c/EclipseIoTDayGrenoble2019... · 2019-02-20 · Distributed Device Management for IoT In action

How a server works

Redis Pub/Sub

Redis DB

FirmwareUpdate on device <Id> !

Launch Update with <firmware_url> !

Get the IP address of the device from its regId

Server can use the Pub/Sub bus to notify the progress of operations

Page 34: Distributed Device Speakers: BERLEMONT Samuel Management …wiki.eclipse.org/images/1/1c/EclipseIoTDayGrenoble2019... · 2019-02-20 · Distributed Device Management for IoT In action

Changes on leshan-server-clusterIn order to allow the detection of arrivals and exits of servers in the cluster

Creation of the class leshan-server-cluster/src/main/java/org/eclipse/leshan/server/cluster/RedisServerEventPublisher.java : RedisServerEventPublisher

• Publish start/stop event of a server• Store Server ID inside database

Redis DB

{ LESHAN_SERVER_ID:<server_id> ; (<server_addr>, <secured_server_addr>) }

Creation of a new key/value in the store :

Page 35: Distributed Device Speakers: BERLEMONT Samuel Management …wiki.eclipse.org/images/1/1c/EclipseIoTDayGrenoble2019... · 2019-02-20 · Distributed Device Management for IoT In action

Changes on leshan-server-clusterIn order to allow multiserver

Modification of the data structure stored in Redis Database :

Redis DB

 

{ REG:EP:<endpoint> ; <serialized_registration_data> }

Redis DB

{ REG:EP:<endpoint> ; [<server_id> :<serialized_registration_data>, ... ]}

And token handlers hold now, the regID in addition of endpoint name :Before token handlers were EP#UID#endpoint and now it is EP#UID#regId#endpoint

Finally following classes have been impacted :• leshan-server-cluster/src/main/java/org/eclipse/leshan/server/cluster/LeshanClusterServer.java• leshan-server-

cluster/src/main/java/org/eclipse/leshan/server/cluster/RedisRegistrationStore.java• leshan-server-

cluster/src/main/java/org/eclipse/leshan/server/cluster/RedisRequestResponseHandler.java• leshan-server-cluster/src/main/java/org/eclipse/leshan/server/cluster/RedisTokenHandler.java

Page 36: Distributed Device Speakers: BERLEMONT Samuel Management …wiki.eclipse.org/images/1/1c/EclipseIoTDayGrenoble2019... · 2019-02-20 · Distributed Device Management for IoT In action

Contents • Why Leshan ?• How we used it• Proxies• Servers• Wakaama on ESP32• How it is integrated in the demonstration• Near future work

Page 37: Distributed Device Speakers: BERLEMONT Samuel Management …wiki.eclipse.org/images/1/1c/EclipseIoTDayGrenoble2019... · 2019-02-20 · Distributed Device Management for IoT In action

Wakaama on ESP32In order to allow firmware update on esp32 without the help of the proxy

Based on wakaama client example distributed with Wakaama sources

Using the ESP32 SDK (with FreeRTOS)

HTTP Downloader

RGB LED controller

OTA

To download the firmware on the board

To light on/off an RGB LED

To process the firmware update

Page 38: Distributed Device Speakers: BERLEMONT Samuel Management …wiki.eclipse.org/images/1/1c/EclipseIoTDayGrenoble2019... · 2019-02-20 · Distributed Device Management for IoT In action

Contents • Why Leshan ?• How we used it• Proxies• Servers• Wakaama on ESP32• How it is integrated in the demonstration• Near future work

Page 39: Distributed Device Speakers: BERLEMONT Samuel Management …wiki.eclipse.org/images/1/1c/EclipseIoTDayGrenoble2019... · 2019-02-20 · Distributed Device Management for IoT In action

How it is integrated in the demonstration

 

DM Server

Bus PUB/SUB

DM Server

Proxy DeviceDevice LWM2M compatible

Wifi (detected using Avahi)Ou BT (via serial stack of Linux)

Redis connector

DB

Socket-io (/hmi)

Socket-io (/leshan)

DM NetworkNetworkX

dm_network.json

firmwares

Page 40: Distributed Device Speakers: BERLEMONT Samuel Management …wiki.eclipse.org/images/1/1c/EclipseIoTDayGrenoble2019... · 2019-02-20 · Distributed Device Management for IoT In action

Contents • Why Leshan ?• How we used it• Proxies

• How a proxy work• Changes in leshan-client-demo

• Servers• How a server works• Changes in leshan-server-cluster

• Wakaama on ESP32• How it is integrated in the demonstration• Near future work

Page 41: Distributed Device Speakers: BERLEMONT Samuel Management …wiki.eclipse.org/images/1/1c/EclipseIoTDayGrenoble2019... · 2019-02-20 · Distributed Device Management for IoT In action

Near future work

 

● Using the acquired experience to clean the architecture (micro-services?)● Implement a generic layer to address other protocols (not only LWM2M)● Synchronize with upstream Leshan code.

Page 42: Distributed Device Speakers: BERLEMONT Samuel Management …wiki.eclipse.org/images/1/1c/EclipseIoTDayGrenoble2019... · 2019-02-20 · Distributed Device Management for IoT In action

Thanks

 

Page 43: Distributed Device Speakers: BERLEMONT Samuel Management …wiki.eclipse.org/images/1/1c/EclipseIoTDayGrenoble2019... · 2019-02-20 · Distributed Device Management for IoT In action

14 Externe Orange

Multi-server demo architecture

Page 44: Distributed Device Speakers: BERLEMONT Samuel Management …wiki.eclipse.org/images/1/1c/EclipseIoTDayGrenoble2019... · 2019-02-20 · Distributed Device Management for IoT In action

15 Externe Orange

ESP32 Airboard

ESP32

DM API

Page 45: Distributed Device Speakers: BERLEMONT Samuel Management …wiki.eclipse.org/images/1/1c/EclipseIoTDayGrenoble2019... · 2019-02-20 · Distributed Device Management for IoT In action

16 Externe Orange

ESP32 Airboard

DM Dashboard

Message bus

ESP32

DM API

Page 46: Distributed Device Speakers: BERLEMONT Samuel Management …wiki.eclipse.org/images/1/1c/EclipseIoTDayGrenoble2019... · 2019-02-20 · Distributed Device Management for IoT In action

17 Externe Orange

DM Server 1

DM Server API

ESP32

DM Server 2

DM Server API

Airboard

DM Dashboard

Message bus

ESP32

DM API

Page 47: Distributed Device Speakers: BERLEMONT Samuel Management …wiki.eclipse.org/images/1/1c/EclipseIoTDayGrenoble2019... · 2019-02-20 · Distributed Device Management for IoT In action

18 Externe Orange

Proxy Manager

DM Server 1

DM Server API

ESP32

DM Server 2

DM Server API

Airboard

DM Dashboard

Message bus

Proxy Manager

ESP32

DM API

Page 48: Distributed Device Speakers: BERLEMONT Samuel Management …wiki.eclipse.org/images/1/1c/EclipseIoTDayGrenoble2019... · 2019-02-20 · Distributed Device Management for IoT In action

19 Externe Orange

Proxy Manager

DM Server 1

DM Server API

ESP32

DM Server 2

DM Server API

Airboard

DM Dashboard

Message bus

Proxy Manager

DM API

Proxy Airboard

ESP32

DM API

Page 49: Distributed Device Speakers: BERLEMONT Samuel Management …wiki.eclipse.org/images/1/1c/EclipseIoTDayGrenoble2019... · 2019-02-20 · Distributed Device Management for IoT In action

20 Externe Orange

Proxy Manager

DM Server 1

DM Server API

ESP32

DM Server 2

DM Server API

Airboard

DM Dashboard

DM API

Proxy ESP32

Message bus

Proxy Manager

DM API

Proxy ESP32

DM API

Proxy Airboard

ESP32

DM API

Page 50: Distributed Device Speakers: BERLEMONT Samuel Management …wiki.eclipse.org/images/1/1c/EclipseIoTDayGrenoble2019... · 2019-02-20 · Distributed Device Management for IoT In action

21 Externe Orange

Proxy Manager

DM Server 1

DM Server API

ESP32

DM Server 2

DM Server API

Airboard

DM Dashboard

DM API

Proxy ESP32

Message bus

Proxy Manager

DM API

Proxy ESP32

DM API

Proxy Airboard

ESP32

DM API

Page 51: Distributed Device Speakers: BERLEMONT Samuel Management …wiki.eclipse.org/images/1/1c/EclipseIoTDayGrenoble2019... · 2019-02-20 · Distributed Device Management for IoT In action

22 Externe Orange

Proxy Manager

DM Server 1

DM Server API

ESP32

DM Server 2

DM Server API

Airboard

DM Dashboard

DM API

Proxy ESP32

Message bus

Proxy Manager

DM API

Proxy ESP32

DM API

Proxy Airboard

ESP32

DM API

Page 52: Distributed Device Speakers: BERLEMONT Samuel Management …wiki.eclipse.org/images/1/1c/EclipseIoTDayGrenoble2019... · 2019-02-20 · Distributed Device Management for IoT In action

23 Externe Orange

Time for the demo!

Page 53: Distributed Device Speakers: BERLEMONT Samuel Management …wiki.eclipse.org/images/1/1c/EclipseIoTDayGrenoble2019... · 2019-02-20 · Distributed Device Management for IoT In action

24 Externe Orange

New solutions • Multi-server, multi-protocol architecture

• Integration of multiple and new DM servers

• A need for abstraction

Next Steps with Eclipse IoT • Contributions

• Leshan

• Wakaama + ESP32

• Study of integration

• Hono

• hawkBit

Conclusion

Page 54: Distributed Device Speakers: BERLEMONT Samuel Management …wiki.eclipse.org/images/1/1c/EclipseIoTDayGrenoble2019... · 2019-02-20 · Distributed Device Management for IoT In action

Thank you