 So we will see Studio. Studio is basically the user interface, the web user interface, which basically controls entire platform. Then we will look at command-line interface that we have for controlling platform. Together with close-gint integration, we will look a bit into the mobile SDKs that you can use for good to develop applications. And we will also, I will show you at least, I'm not sure we will have time to do that, but I will show you how to build a zero-code app. Basically, you can use drag and drop to build a simple app. Really, in a minute, you can have it deployed in five minutes, I hope. Have you, John, have you ever tried to measure how much time it takes to build a drag and drop? It depends on how quickly you can drag and drop. Oh, yeah. I'm not good with mouse, so it should be really a few minutes. So then I will show you back-end integration, how we can basically integrate with any back-end system in either in public internet or behind the VPN. And we will look, we won't look, but we will use, we will remotely use a load farm, which is the thing which helps you to build your mobile applications for all the platforms that mobile platform supports. And also, we will do a little bit at App Store, which is the thing which, for example, if you have a company or you have family and you want to expose the applications for all your family members or maybe all the company employees, then you can use Enterprise App Store to expose all the applications. And I'll let them install it. So I will repeat once more. You have to have internet for this session. That's the most crucial thing here. So please, let's try that it works. And the Wi-Fi has enough boundary to handle us all. And if it doesn't work, let's connect to my shared mobile workshop network. The password is mobilerocks. Good. Just raise hand if anything. So let me just go quickly to what mobile platform is for those of you who haven't been on the Jones session. So basically, mobile platform is something which sits usually between the mobile apps, the group part, and between the backend apps, which maybe whatever you can think about. It can be something who, but it can also be some old Java backend application written in Spring, I don't know, Spring 2 or something. No, I'm just joking. I like Java. So this is your backend applications. And your apps are basically communicating through the red and mobile form to the backend systems. It basically enables you to communicate with the backends, which usually have some APIs that shouldn't be exposed publicly. So it means there's a secure way to communicate to the backend systems behind the VPN, for example. And let's look closely what the platform has inside. I will use this nice tool. So at first, mobile platform helps you to build applications. So if you look into the platform, you will see that there are templates that you can directly use to scaffold application very fast. Or it even has so-called forms apps, which are zero code or cobalt apps, that you can use drag and drop system or the drag and drop UI to build application. And it will be automatically handled. These applications are usually very simple. Like, they are just forms for, say, for maybe some incidents on the road or, I don't know, maybe floods are happening in your country. So you need to build some applications very quickly. So you just use cobalt and you can scaffold it and deploy it to production in our site. And you can develop applications on the platform directly or you can use your laptop to build it, however you want. And the platform basically goes in the brain care on tools fashion. So usually you can use all the frameworks that you like, all the running or powering, whatever platform. For example, I have native platforms here and also some hybrid-run frameworks like Zamarin and AppExplorator, whatever you want. You may use whatever editor you want. And then, except the application development, the platform basically serves as deployment target. The deployment target is called Mbapps, mobile backend as a service. It provides some neat features like data synchronization, storage, security authentication, management of APIs. Basically, it's built in microservices fashions. It's powered by Node.js microservices. And then, basically, around the platform you have, we call it core, and this core basically serves as something which helps you to develop and deploy these applications. It manages the lifecycle of the applications. So you can have application in development, in production, in test, in whatever stage you can imagine in your company. And of course, this application platform can deploy to either public cloud. It can be deployed to public cloud. It can deploy to private cloud like OpenShift Enterprise or hybrid clouds. It can even deploy in itself to something which is called DynoFarm, and it runs in on Linux containers, I believe. So today, first, I'd like to ask you what's your experience, actually. So we can start from appropriate level. Is here anyone who have already built some application, some mobile application? It's like less than half of you. That's nice, that's nice. And which of you actually built some native SDK application? It's like half of you who built some application and a hybrid. Oh, it's more native apps than a hybrid. Who ever used Node.js? Oh, OK. It's not changing, you know? And have any one of you used Pinary before? Oh, nice. Just read it on mobile people. A little bit I expected that. So prerequisites for this version. At first, you have to have operating system. If you don't have, you can just follow. Yeah, I can see there are people with video laptops who you can follow and see. You can reproduce it. It's not recorded, is it? It's not recorded. You have to have browser. You could have mobile browser, but it will be just the same browser. Optionally, if you want to actually run your application, you should have Android phone. Could you raise your hand if you have Android phone and you plan to deploy it to it? Yeah, that's about half of us. And you have to have internet. Really? If you have laptop, you have to have internet. So the first thing that we will have to do is actually registering for an account on OpenShift. So we will be able to use it to log in into mobile platform. So let's go to OpenShift.com and register for the account. Could you just raise your hand if you have already OpenShift account? Again, it's a half of them. It's like one third. So let's go to OpenShift.com and apply for an account. I will do that with you, Simultana Sir. I'm going to receive. I don't know, let's ask OpenShift guys. You can check there whether you want to receive spam or not. It's not called that way, but you can figure out. So if you have some problems with your registration, just let me know. For example, if you are a robot or a spam bot, so you have to check the email then and click on the link that will come to the email. I just wasn't logged into my email, so it takes time. So you should be logged in the OpenShift now. Please still working on registration. I will leave one more second. And you also have to make sure that you have at least one free GR at the OpenShift. So if you have already three applications there and you have just three accounts, then you need to delete at least one application. I hope don't delete production applications. So then I had instructions on the schedule of the conference that we should have these installed. So if you want to build the application or run it or control it locally, then you have to have these things installed. And I have one error there. Actually, FH, FHC. You have to have GIT, Node.js, 0.10, then FH, FHC, and whatever text editor you want, even note that it will do. I hope Mux users won't leave at this point. OK, so next step. Is anyone still in the process registering? If you have some problems, I have some backup accounts. So if you have problems registering, just let me know. And I will give you backup accounts. We will be able to plug in directly. Otherwise, I will continue. You have to register or apply for invitation to Red Hat Mobile Platform on OpenShift.feedhannery.com. If you are curious what is Feed Henry, it is the name of the project which Red Mobile used to be. So anyone need backup account for OpenShift? No? You want to tell me that I have created 10 spare accounts and we won't use any of them? You don't have to use any promotion code? And again, you will have to click a link in the email. What will the platform do? It will create an application in your OpenShift 2 account. Does it work? Now you can connect to this mobile workshop, another Wi-Fi. I have spun a Wi-Fi just for this. OK, I need to click invitation for the first time. You have to click, I made a mistake. You have to click the invitation in the email and then you can log in your OpenShift account with your OpenShift account credentials. Yeah, and it will ask you for a domain name. So please use some non-conflicting name. For example, DevConf is probably a good choice. So if you finish, you should basically be in the studio, in a platform studio. Is there anyone who is already online? So is there anyone who doesn't have, who isn't logged into the studio yet? One or two? Wait a few seconds. Again, I can give you a spare account. So if you have any problems connecting. That's good. So again, is there anyone still in the registration process? No? Perfect. OK, so we should all be right here. And what we will do first is we'll go, before I will explain what's here, we'll actually go and create a project. And I will explain you in a bit. So let's go to our project list and click on a new project. Studio will basically offer you the list of templates that is installed in this deployment platform. And here you can choose from a lot of different kinds of projects. So you can see there is a Hello World project or some push notification enabled sample or template. Then there are Cordova templates or native SDKs, windows here, here is an accelerator. Summarine. I'm a little bit lost. Yeah, you have to go to openshift.feedandry.com and request an invite. Then another mail will come and you have to click on the registration. There are also some AngularJS or Angular Ionix slash Cordova and it's my favorite that why they are again. Here we will use the Vulkan project template. So let's choose it. And you have to name it somehow. So for example, Vulkan to Defqon is the end of the first day but still Vulkan to Defqon. And then hit Create button. You can rename the apps that will be installed. So you can see this will create four applications. The first one will be CloudApp. Second one will be Cordova Lite, type of application, then a native Android, and also native Windows. Don't use any iOS kind of app. On this openshift.feedandry.com, we can actually build only Android apps. You can write iOS apps but you won't be able to build them. So for this purpose, please just Vulkan project. So let's create it. So here are the instructions if you have a chance to follow me. OK, so at the end, you should have green bar. The CloudApp has not been deployed yet? Oh, for sure. And that's why I wanted to start or create a project right at the beginning. Because since we are using OpenShift to deployment, we will have to go and deploy it now because it will take a few minutes to actually deploy to OpenShift. So who already got the green bar? Nice. And who haven't? Cool, anyone? You, but you will catch up. So here you can see what it has actually installed. So you can see if you go back to the project, you will now see your project listed. Welcome to DevCon. And if you click on it, you will see what they did create it. So it creates three client apps, the mobile apps. Backup account? Yes. Yeah, sure. Could we use one? Yeah, yeah, yeah. They are all called DevCon. Some number at fridge.eu. I will probably make a deal. I will give you, I've prepared them here on papers. So we don't actually deploy DevCon a number at fridge.fryc.edu. Could you maybe help? Do you still need help to catch up? No. Or is everything OK? OK, fine, fine. New project already? Dev? OK. Improved it? Create it? Yes. And create a welcome project? Oh, it's great. Then you can click finish at the end. Could you help me, Peter? Oh, yeah, sure. That's written. It's not written anywhere. Oh, it's the same as a Wi-Fi or wireless password. So mobile rocks. So it installed three client apps, 100, 100 at the editor. And one windows. And also the cloud app, it doesn't use iService. So what we will do now is clicking on the cloud app and go to deploy that. And just click deploy cloud app. Oh, there you go. Yeah. OK. So you should see progress bar when it's up, probably. Where is that? Could you click here? Oh, there it is. Yeah. Jason will just come. Left hand side deploy. Deploy on in this navigation. It takes a couple of minutes. Yeah, deploying. Deploying. Yeah, it takes time. Go ahead, Jason. You manage them. It takes a couple of minutes for the first time. Yeah, it has to create everything in your OpenShift online account, and it takes a few minutes. So if you probably go to your OpenShift account, it's optional step, but you go to the console, then you will see deploy file found. Oh, oh, it fell for me as well. Why? You can use the welcome project, the third one. Third one down, yeah. It's on the right bar, OK. Give it a name. Details. OK, all I need to master right now is trying to find the information from the nodes. OpenShift is down. Let's blame OpenShift. I would say just try it again. We have killed OpenShift. Yes. Right. Everyone go to the pub. You pay? No. It doesn't really matter. It's OK. So you just have to go to the pub? Yeah. It's good to be here. It's good to be here. Yeah, well, we have at least one success. So let's try it again if it didn't work. I think with the other types of deployment, it is more stable. Yeah. If you're on a platform, for example, in your company, then you can choose between different types of the deployment targets called embossed targets. It hasn't been called? This one is OpenShift 2 target, just because it's for free. But you can also have the deployment target called feedback which is basically built for or optimized just for the mobile platform. And you have OpenShift 3 target that we have under release. Yeah. OK. So you will have it in the coming quarter. So if you run your OpenShift in a company, then you will be deployed apps directly to OpenShift. We are seeing some areas in the actual OpenShift.com console as well as saying that they're experiencing technical difficulties. Nice. So I can install it on my own server. Yeah. OK. Uh-huh. Yeah. Yeah. Let's look into OpenShift.com. And see, for example, for me, the app has already been created. But it's still... It will take a while, though. Six or seven minutes first time. Yeah. So if it fails, let's try it again, because we want at the end to have everyone the cloud app running. And in the meantime, I will go to the studio in another tab, and walk you through what you can find in the studio. So at first, you will see... We have dived directly into the projects, but if you are at home, you can click on Getting Started, and you will basically find the documentation of how to get started with the platform. In the projects, you will see all the projects that the user of the platform has access to. So you will see... If you have many applications for your domain, then you can click on Mine, and you will see just your application, and you can search for it or everything. You can basically have as many applications as you want to hear. So basically, your OpenShift subscription allows you to deploy it. Then you can go to the reporting analytics, and you will see the basic analytics here. You can go to the detail. However, we won't see anything yet, since it is pretty new deployment. You can filter them by location. Then we have a concept which is called embossed services. And embossed services, if you remember from a preview screen, is the third column. So your client applications basically communicates to the apps running Node.js or other by Node.js. And these comments can communicate with embossed services. If you install a new service just by clicking plus, so we have to first provision the service, and we could probably do that now. It will take another year or more. Two years. Yes, so in order to use forms, if you have enough years, then we can deploy OpenShift Embossed Service, which is basically the service which the zero code or codeless applications use in the background. So I will use it. I'm not sure if we should do that to OpenShift, guys. Oh, let's try that. So OpenShift Embossed Service. And these services are basically integrations with the third parties. You can see that there are services for integration to SharePoint, PayPal, I don't know a lot of them. So I will skip it for now. We will do that if we have time. But if we dive into what we have actually created, I have run to the first of the applications. You can see that we have navigation, which helps us to do that. So here you navigate between projects, and you can navigate between applications. So let's go to the Vulkan Project Client application. And you can see that it is directly, it is previewed in the window, so you can see what you will be running. You can see that it is previewed. It is previewed in the window, so you can see what you will be running at the end of making the font bigger than how it will be. Projects? Oh, yeah. Nice. Or you can even open the application here in our window. If we have the cloud, this is a preview of the cloud app, and it is connected to the project that you have deployed. So you have three different types of applications. I am just doing a vol to the studio, so you can see what you can use. We will once everyone here has a font, then we will open the cloud applications. So if you want, you can go to the, when you, as we remember, creating websites in Microsoft Office. Yeah, so we should have a green bar at the end of deployment. So again, if you go to projects, use a project and go to the client app, then you see the preview of the application. You can preview in full browser because it is just an application which uses web standards and APIs. And you can verify that you can call the cloud, and it should tell you that you should get a response. So what else we have in our client app? You can see that there is a documentation. This documentation is basically, it generates the markdown file which is in your project. So if you click next on the editor and open Readme MD, there is none. Yeah, it's opening. There is a markdown which it basically regenerates to the documentation. So it's nice for developers. You can have there even the API blueprint. There are the analytics, again, which are displayed for this app specifically. There is a configuration for different targets, for different platforms. There is a push integration, if you like. You have to enable it first. But what we will do now, could you raise your hand if you have already finished deployment? Sorry, again, the other way around. Who haven't finished deployment yet? Three, five, four. Let's wait a bit. Okay, so let's go back again. You can go to the cloud app as well. You will see that the structure is similar. There is the cloud app. It says that it's running. You have documentation. You have the inline editor where you can of course edit it right in the cloud or you can use it locally. I will show you in a few minutes. Through the application with some environment variables, you can see what data are stored using the platform APIs, some statistics logs from the application. What is important is that you can run this application in several stages, as I already told you. You can switch here between development and production, but we haven't deployed to production yet. So we will be using the development target environment. I'm not sure if we can create more environments in this instance, but in your deployment, in your platform deployment, you can definitely define as many stages as you want. So if your development cycle basically takes some user acceptance testing or I don't know, some weird testing stage, then you can do that. I would probably add at least staging here. On the other axis, you can... I don't know what the connections are about. Would you tell anything else about it? About the studio set? About the networking portion specifically? No, I think you've covered most areas of the... What we need to know now. So is here still anyone who haven't deployed yet? Two, three. Do you want some help? Just waiting. Still waiting. OK, let's wait for him. So sorry, anyone who's still waiting needs to have a blue bar. It has to be on red. If the bar is on red, it means the floor has failed. You want to try it again. So what else do we show here? We could... Yeah, I'm waiting for everyone to have it, or we don't have to have it. Everyone. So yeah, let's do and build it. If you have Android phone and you want to build it, we will use another neat feature, and it's a build farm. The build farm is used by platform underneath. However, we will use it directly. We will use it remotely. So let's enter some of the client apps. I will use... No, let's use the Cordova Lite app, the Vulkan project client, and hit go to the build, build tab, and hit Android, and finally hit build. Which version of Android is it? It's four. Actually, I don't know. It's Cordova Lite. Yeah, so I might be working on that for just a minute. So generally with mobile development, you have native or app hybrid. So native is your typical Android or iOS. You're using Xcode or the Android build tools directly. For hybrid development, there's a solution called Cordova. It's an Apache project. With Cordova, typically if you're doing Cordova development vocally, you install the Cordova tools and you use them to create a new project, and you add whatever version of whatever operating system you want for both operating systems. The concept we're working with here is something called Cordova Lite, something that was built into the red app mobile platform. It's specifically designed for people who have web development experience who weren't familiar with mobile development, weren't familiar with hybrid or native. And it abstracts away all of the Cordova stuff and exposes just the HTML, CSS, and JavaScript. So when you go to build a Cordova Lite application, the system decides for you based on what's configured, which version of Android or iOS is going to be used. At the moment for the Cordova Lite applications, it is Android 4.4, I think. In about two or three months, we'll have an update coming out that brings the version for a Cordova Lite right up to 5.1. Yeah. If you're using a Cordova application, a full Cordova application, you get to decide as you're adding the platforms what version of the SDKs you're using, and similarly with the native ones in the configuration of properties files, you get to use the version of the operating system you want to charge. So if it builds successfully, you will get a QR code which you can actually scan with your mobile phone. Anyone already got the QR code? Okay, so let's scan the QR code. Yeah, about the permissions. Are they also generated automatically? Because I see there's quite a lot of permissions here. Yeah, there's a lot of permissions. So if we can close the QR code for a minute. So again, for full Cordova apps or for native applications, you use the standard system way of doing it. For Cordova Lite in the config section, if you can go to the config section, and go to Android, it has the list of permissions for the past year, you can untick it once you want. We've had quite a few discussions about whether we should start with them all ticked or not ticked. And there's pros and cons to both. If you start with them all not ticked and someone does a build, most of the functionality, the device integration functionality doesn't work. But if you start with them all ticked, when you go to the app, you see this big long list of permissions. Well, I think it won't be the application's request, as they need them rather than asking for them all upfront. Yeah, so if you don't follow the Android developments with a marginal update, the Android will basically follow what Apple does, and you will be every time asked for the permission which it needs ad hoc. So you won't get this long list of permissions which you probably get. And for backwards compatibility, it will be still necessary. By the way, for this, I believe you need just location. So if you want to update it and build it again, yeah, it will. So you can again connect your mobile phones to this network if you want. So who have the app already running? All of them. Is there anyone who is still trying? Perfect, so let's finish it. Let's install it first so we can click around. It's been a while to cancel a deal. I got a message that something is wrong, but you never realize it's still running. It isn't called you don't care. It's Karen he cares. He says counting every bill. What do you think about this ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?