This commit is contained in:
gsegares 2019-04-03 11:02:20 +13:00 коммит произвёл Jamie Wilbraham
Родитель 19d11661d6
Коммит d53d9534eb
615 изменённых файлов: 137435 добавлений и 4 удалений

Просмотреть файл

@ -1,8 +1,28 @@
# Redirect Information
These labs have been moved to a new repository.
# AI School Tutorials
Please click the link below to be redirected. Sorry for the inconvenience.
This repository contains a collection of AI tutorials that are featured on [Microsoft AI School](https://aischool.microsoft.com).
[Microsoft AI Labs](https://github.com/Microsoft/ailab).
## [Sketch2Code](./sketch2code)
See how Azure Custom Vision can create a model that takes a hand drawn wireframe and turns it into valid HTML code.
## [Snip Insights](./snipinsights)
Apply Azure Cognitive Services to gain intelligent insights within a screen capture application.
## Other Labs
You can find other AI Labs in this [Github repo](https://github.com/Microsoft/ailab).
## Contributing
This project welcomes contributions and suggestions. Most contributions require you to agree to a
Contributor License Agreement (CLA) declaring that you have the right to, and actually do, grant us
the rights to use your contribution. For details, visit https://cla.microsoft.com.
When you submit a pull request, a CLA-bot will automatically determine whether you need to provide
a CLA and decorate the PR appropriately (e.g., label, comment). Simply follow the instructions
provided by the bot. You will only need to do this once across all repos using our CLA.
This project has adopted the [Microsoft Open Source Code of Conduct](https://opensource.microsoft.com/codeofconduct/).
For more information see the [Code of Conduct FAQ](https://opensource.microsoft.com/codeofconduct/faq/) or
contact [opencode@microsoft.com](mailto:opencode@microsoft.com) with any additional questions or comments.

6
sketch2code/.gitignore поставляемый Normal file
Просмотреть файл

@ -0,0 +1,6 @@
.DS_Store
.vscode/
.vs/
bin/
obj/
packages/

Просмотреть файл

@ -0,0 +1,15 @@
using System.Collections.Generic;
namespace Import
{
public class Image
{
public string Id { get; set; }
public int Width { get; set; }
public int Height { get; set; }
public IList<Tag> Tags { get; set; }
public IList<Region> Regions { get; set; }
}
}

Просмотреть файл

@ -0,0 +1,12 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>netcoreapp2.1</TargetFramework>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.Azure.CognitiveServices.Vision.CustomVision.Training" Version="0.12.0-preview" />
</ItemGroup>
</Project>

Просмотреть файл

@ -0,0 +1,92 @@
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Reflection;
using Microsoft.Azure.CognitiveServices.Vision.CustomVision.Training;
using Microsoft.Azure.CognitiveServices.Vision.CustomVision.Training.Models;
using Newtonsoft.Json;
namespace Import
{
class Program
{
private static readonly int BATCH_SIZE = 50;
static void Main(string[] args)
{
// Create the Api, passing in the training key
string trainingKey = "";
if (String.IsNullOrEmpty(trainingKey))
{
Console.WriteLine("The custom vision training key needs to be set.");
Environment.Exit(1);
}
TrainingApi trainingApi = new TrainingApi() { ApiKey = trainingKey };
// Find the object detection project
var domains = trainingApi.GetDomains();
var objDetectionDomain = domains.FirstOrDefault(d => d.Type == "ObjectDetection");
var project = trainingApi.GetProjects().FirstOrDefault(p => p.Settings.DomainId == objDetectionDomain.Id);
string modelPath = Path.Combine(Environment.CurrentDirectory, "..", "model");
string dataPath = Path.Combine(modelPath, "dataset.json");
string imagesPath = Path.Combine(modelPath, "images");
var images = JsonConvert.DeserializeObject<IEnumerable<Image>>(File.ReadAllText(dataPath));
// Create tags, unless they already exist
var existingTags = trainingApi.GetTags(project.Id);
var tagsToImport = images
.SelectMany(i => i.Tags
.Select(t => t.TagName))
.Distinct()
.Where(t => !existingTags.Any(e => string.Compare(e.Name, t, ignoreCase: true) == 0));
if (tagsToImport.Any())
{
foreach (var tag in tagsToImport)
{
Console.WriteLine($"Importing {tag}");
var newTag = trainingApi.CreateTag(project.Id, tag);
existingTags.Add(newTag);
}
}
// Upload images with region data, in batches of 50
while (images.Any())
{
var currentBatch = images.Take(BATCH_SIZE);
var imageFileEntries = new List<ImageFileCreateEntry>();
foreach (var imageRef in currentBatch)
{
var regions = new List<Microsoft.Azure.CognitiveServices.Vision.CustomVision.Training.Models.Region>();
foreach (var region in imageRef.Regions) {
regions.Add(new Microsoft.Azure.CognitiveServices.Vision.CustomVision.Training.Models.Region() {
Height = region.Height,
Width = region.Width,
Top = region.Top,
Left = region.Left,
TagId = existingTags.First(t => t.Name == region.TagName).Id
});
}
string imagePath = Path.Combine(imagesPath, string.Concat(imageRef.Id, ".png"));
imageFileEntries.Add(new ImageFileCreateEntry()
{
Name = imagePath,
Contents = File.ReadAllBytes(imagePath),
Regions = regions
});
}
trainingApi.CreateImagesFromFiles(project.Id, new ImageFileCreateBatch(imageFileEntries));
images = images.Skip(BATCH_SIZE);
}
Console.WriteLine("Training data upload complete!");
}
}
}

Просмотреть файл

@ -0,0 +1,11 @@
namespace Import
{
public class Region
{
public string TagName { get; set; }
public double Left { get; set; }
public double Top { get; set; }
public double Width { get; set; }
public double Height { get; set; }
}
}

Просмотреть файл

@ -0,0 +1,7 @@
namespace Import
{
public class Tag
{
public string TagName { get; set; }
}
}

381
sketch2code/README.md Normal file
Просмотреть файл

@ -0,0 +1,381 @@
# Sketch2Code
## Description
This lab will guide you through the process of using Azure Custom Vision to create a solution that is capable of transforming a handwritten user interface into valid HTML markup.
## Process Flow
The process of transformation is detailed as follows:
1. The user uploads an image through the website.
2. A custom vision model predicts what HTML elements are present in the image and their location.
3. A handwritten text recognition service reads the text inside the predicted elements.
4. A layout algorithm uses the spatial information from all the bounding boxes of the predicted elements to generate a grid structure that accommodates all elements.
5. An HTML generation engine uses all this information to generate HTML markup code reflecting the result.
## Architecture
The Sketch2Code solution is made up of the following components:
- A Microsoft Custom Vision Model: This model has been trained with images of different handwritten designs tagged with the information of common HTML elements such as buttons, text boxes and images.
- A Microsoft Computer Vision Service: Provides OCR character recognition capabilites that can turn handwritten images into digital text.
- An Azure Blob Storage: All steps involved in the HTML generation process are stored, including the original image, prediction results, and layout grouping information.
- An Azure Function: Serves as the backend entry point that coordinates the generation process by interacting with all the services.
- An Azure web site: A frontend application that enables the upload of a new design and outputs the generated HTML results.
These components form the architecture as follows:
![Sketch2Code Architecture](./images/architecture.png)
## Setup your environment
### A) Setup your Azure subscription
This lab **requires** an Azure subscription. If you delete the resources at the end of the session, total charges will be less than $1 so we strongly recommend using an existing subscription if available.
If you need a new Azure subscription, then there are a couple of options to get a free subscription:
1. The easiest way to sign up for an Azure subscription is with VS Dev Essentials and a personal Microsoft account (like @outlook.com). This does require a credit card; however, there is a spending limit in the subscription so it won't be charged unless you explicitly remove the limit.
* Open Microsoft Edge and go to the [Microsoft VS Dev Essentials site](https://visualstudio.microsoft.com/dev-essentials/).
* Click **Join or access now**.
* Sign in using your personal Microsoft account.
* If prompted, click Confirm to agree to the terms and conditions.
* Find the Azure tile and click the **Activate** link.
1. Alternatively, if the above isn't suitable, you can sign up for a free Azure trial.
* Open Microsoft Edge and go to the [free Azure trial page](https://azure.microsoft.com/en-us/free/).
* Click **Start free**.
* Sign in using your personal Microsoft account.
1. Complete the Azure sign up steps and wait for the subscription to be provisioned. This usually only takes a couple of minutes.
### C) Download the lab materials
Download the sample code provided for this lab, it includes the following:
* Training images
* Training label data
* An Azure orchestrator function
* The Sketch2Code frontend app
To Download:
1. Click **Clone or download** from this repo.
1. You can clone the repo using git or click **Download ZIP** to directly download the code from your browser.
## Introduction to the Azure Custom Vision Service
### A) Introduction to Azure Custom Vision
The Azure Custom Vision Service lets you easily build your own custom image classifiers, without needing any knowledge of the underlying machine learning models. It provides a web interface that allows you to upload and tag training data, as well as to train, evaluate, and make predictions. You can also interact with your custom models via a REST API.
The Custom Vision service has recently been enhanced to include Object Detection, which allows you to train the service to detect multiple objects inside an image with their locations.
This module will guide you through the process of creating an Object Detection project, and tagging your first image.
##### What is Object Detection?
Image Classification is the process of taking an image as input and outputting a class label out of a set of classes.
Image Classification with Localization is the process that takes an image as input, outputs a class label and also draws a bounding box around the object to locate it in the image.
One step beyond that is Object Detection; this process applies image localization to all the objects in the image, which results in multiple bounding boxes and can have multiple applications like face detection, or autonomous driving.
### B) Create an Object Detection project
We'll start by creating a new Custom Vision object detection project:
1. In your web browser, navigate to the [Custom Vision](https://customvision.ai/) web page. Select Sign in to begin using the service.
1. To create your first project, select **New Project**. For your first project, you are asked to agree to the Terms of Service. Select the check box, and then select the I agree button. The New project dialog box appears.
1. Enter a name and a description for the project. Then select `Object Detection` for the project type.
1. Select a Resource Group. The Resource Group dropdown shows you all of your Azure Resource Groups that include a Custom Vision Service Resource. You can also create select limited trial. The limited trial entry is the only resource group a non-Azure user will be able to choose from.
1. To create the project, select **Create project**.
### C) Tag an image
Next we'll use the Custom Vision web interface to tag images. In this section we are going to see how to manually tag an image, but later you'll also see how this can be done via the REST API.
1. To add images to the classifier, use the **Add images** button.
> Custom Vision Service accepts training images in .jpg, .png, and .bmp format, up to 6 MB per image. (Prediction images can be up to 4 MB per image.) We recommend that images be 256 pixels on the shortest edge. Any images shorter than 256 pixels on the shortest edge are scaled up by Custom Vision Service.
1. Browse for the file `sample.png` inside the `model` folder of the downloaded repository files and select `Open` to move to tagging.
1. Click the `Upload 1 file` button.
1. Select **Done** once the image has been uploaded.
1. Then click the uploaded image to start tagging.
1. Draw a box surrounding the title of the image: `LANGUAGE OPTIONS` and add the tag `Heading` to the text field and click the `+` button.
1. Draw a box surrounding one of the checkbox in the image including the label, for example the checkbox and the word `english`; add the tag `CheckBox` in the same way than before.
1. Do the same for all the checkboxes in the image but now select the tag created before.
1. The final result of the tagging should look similar to this image: ![Tagging Example](./images/sample-tagging.png)
## Train an object detection model
In this section we are going to see how to train and test an Object Detection model.
The more images you include in your training set, the better your model will perform. To save time, we've provided 150 images with a set of tags. The training set used to create the sample model in the project is located in the **model** folder. Each training image has a unique identifier that matches the tags contained in the `dataset.json` file. This file contains all the tag information used to train the sample model. A script is provided to upload the training images, along with the tag data.
### A) Upload the full training set
1. Open **Visual Studio 2017** from the Start Menu.
1. Click **Open Project/Solution** from the **File > Open** menu.
1. Select the solution file `Sketch2Code\Sketch2Code.sln` and wait for it to load.
1. Take a look at the `Import` project.
1. Return to **Microsoft Edge** and the [Custom Vision](https://customvision.ai) (customvision.ai) portal.
1. Click on the **settings** icon in the top right corner of portal.
1. Copy the **Training Key** located under the *Accounts* section.
1. Return to **Visual Studio**.
1. Open the **Program.cs** file in the **Import** project.
1. Find the `string trainingKey = "";` code around line 19 and set the value with the copied key value.
```cs
string trainingKey = "";
```
1. Open a terminal and go to the `Import` project folder.
1. Enter the command `dotnet run` and press the enter key.
1. When the import process is finished, you will see the message: `Training data upload complete!`.
> NOTE: The import process assumes that you have only one object detection project. If this is not the case, you will need to update the code to select the correct project.
### B) Train the model
Now that our data set is available, and each image correctly tagged, the training process can begin. This is a quick operation given the small size of our data set. The output is a classifier that can be used to make predictions. In the case that better training data is made available, we can create a new iteration of the classifier and compare its performance.
1. Return to **Microsoft Edge** and the [Custom Vision](https://customvision.ai) (customvision.ai) portal.
1. Select the object detection project you created earlier.
1. Click on the green **Train** button in the top navigation bar.
1. Wait for the training to complete. The process should take around 2 to 3 minutes.
### C) Review model performance
1. Click the `Performance` option in the menu to check how accurate the object detection model is after training.
1. Review the new classifier's precision and recall. Mouse over the tooltips to learn more about these concepts.
### D) Test the model
The portal provides a test page for us to do a basic smoke test of our model with some new, unseen data. In a production scenario, the RESTful API can provide a more convienent mechanism for doing automated predictions.
1. Click on the **Quick Test** button in the top navigation bar.
1. Click the **Browse local files** button.
1. Browse to the downloaded `model` folder and select the `sample_2.png` image.
1. Click **Open**.
1. Wait for the object detection test to run.
1. You should now be able to see how well the service is detecting different objects and their locations in your image.
1. Close the **Quick Test** side bar by clicking on the **X** icon in the top right.
1. Click on the **Predictions** tag in the top nav bar.
1. Here we can see the new test data. If we click on an image, we can manually tag it and add it to our data set. This image will then be included next time we re-train our classifier, potentially leading to improved accuracy.
## Create the Orchestrator Azure Function
In this section we will see how to code a solution to make predictions using the custom model. This will involve using the REST API to make predictions, as well as using the _Computer_ vision service to recognize hand writing in the images.
### A) Configure the Custom Vision connection
1. Return to **Microsoft Edge** and the [Custom Vision](https://customvision.ai) (customvision.ai) portal.
1. Select the object detection project you created earlier.
1. Click on the **settings** icon in the top right corner of portal.
1. Copy the **Training Key** located under the *Accounts* section.
1. Copy the **Prediction Key** located under the *Accounts* section.
1. Copy the **Project Name** located under the *Project Settings* section.
1. Click on the `Performance` option in the menu.
1. Copy the **Iteration name** of the `Default` iteration in the left area, usually `Iteration 1`.
1. Return to **Visual Studio** and open the **local.settings.json** in the root of the `Sketch2Code.Api` project.
1. Find the following content:
```json
"ObjectDetectionTrainingKey": "CustomVisionTrainingKey",
"ObjectDetectionPredictionKey": "CustomVisionPredictionKey",
"ObjectDetectionProjectName": "CustomVisionProjectName",
"ObjectDetectionIterationName": "CustomVisionIterationName",
```
1. Replace the values for each property with what you copied before from the portal.
### B) Register for access to the Computer Vision API
A Microsoft _Computer_ Vision Service is needed to perform handwritten character recognition. Computer Vision services require special subscription keys. Every call to the Computer Vision API requires a subscription key. This key needs to be either passed through a query string parameter or specified in the request header.
1. Go to **Microsoft Edge**.
1. In a new tab, navigate to the [Try Azure App Service](https://azure.microsoft.com/en-us/try/cognitive-services/) portal (https://azure.microsoft.com/en-us/try/cognitive-services/).
1. Select the **Vision APIs** tab if it is not selected.
1. Find **Computer Vision** in the list and click the related **Get API Key** button.
1. Select the **Guest** option by clicking the **Get started** button.
1. Aggre with the terms by checking the box and click the **Next** button.
1. **SIGN IN** using your Microsoft account.
1. Check your APIs subscriptions and find the **Computer Vision** option and copy the first **Endpoint** and **Key 1** values.
1. Return to **Visual Studio** and open the **local.settings.json** in the root of the `Sketch2Code.Api` project.
1. Find the following content:
```json
"HandwrittenTextSubscriptionKey": "ComputerVisionKey",
"HandwrittenTextApiEndpoint": "ComputerVisionEndpoint",
```
1. Replace **ComputerVisionKey** with the value you copied from the API website as the **Key 1**.
1. Replace **ComputerVisionEndpoint** with the value you copied from the API website as the **Endpoint**.
### C) Create an Azure Blob Storage account
An Azure Blob Storage account is used to store all the intermediary steps of the orchestration process. A new folder is created for each step as follows:
⋅* Original.png: The original image uploaded by the user.
⋅* slices: Contains the cropped images used for text prediction.
⋅* results.json: Results from the prediction process run against the original image.
⋅* groups.json: Results from the layout algorithm containing the spatial distribution of predicted objects.
1. Go to **Microsoft Edge**.
1. In a new tab, navigate to the [Azure Portal](https://portal.azure.com/) (https://portal.azure.com/).
1. Click the **Create a resource** in the left menu.
1. Search for **Storage account** and select the `Storage account - blob, file, table, queue` option.
1. Click the **Create** button.
1. Enter all the required information:
- **Name**: Sketch2Sketch2CodeBlobStorage
- **Account kind**: Blob storage
- **Subscription**: Pay-As-You-Go
- **Resource group**: Create or select a desired group.
1. Click the **Create** button and wait for the resource to be created.
1. When the resource is created go to the detail view by clicking the name in the notification or by searching the created resource by name in the `All resources` option.
1. Click in the **Access keys** option in the left menu of the resource.
1. Find the **key 1** section and copy the **Connection string** value by clicking the icon on the right.
1. Return to **Visual Studio** and open the **local.settings.json** in the root of the `Sketch2Code.Api` project.
1. Find the following content:
```json
"AzureWebJobsStorage": "AzureWebJobsStorageConnectionString",
```
1. Replace **AzureWebJobsStorageConnectionString** with the value you copied from the azure portal.
### D) Update the Code
In this section we are going to take a look inside the code and wire up the orchestrator service to the custom vision prediction REST api.
1. Go back to **Visual Studio 2017** from the Start Menu.
1. Take a look to the `Sketch2Code.AI` project.
1. Open the `ObjectDetector.cs` file.
1. Find the following method:
```cs
public async Task<ImagePrediction> GetDetectedObjects(byte[] image)
{
throw new NotImplementedException();
}
```
1. Replace the body of the method with the following code:
```cs
using (var endpoint = new PredictionEndpoint() { ApiKey = this._predictionApiKey })
{
using (var ms = new MemoryStream(image))
{
return await endpoint.PredictImageAsync(this._project.Id, ms);
}
}
```
> The code is calling the API endpoint that returns predictions for the object locations of an input image. More references about the API endpoint can be found [here](https://southcentralus.dev.cognitive.microsoft.com/docs/services/450e4ba4d72542e889d93fd7b8e960de/operations/5a6264bc40d86a0ef8b2c290).
1. Take a look at the `Sketch2Code.Core` project.
1. Open the `ObjectDetectionAppService.cs` file inside the `Services` folder.
1. Find the following method:
```cs
public async Task<IList<PredictedObject>> GetPredictionAsync(byte[] data)
{
throw new NotImplementedException();
}
```
1. Replace the body of the method with the following code:
```cs
var list = new List<PredictedObject>();
Image image = buildAndVerifyImage(data);
ImagePrediction prediction = await _detectorClient.GetDetectedObjects(data);
HandwritingTextLine[] result = await this._detectorClient.GetTextRecognition(data);
if (prediction != null)
{
if (prediction.Predictions != null && prediction.Predictions.Any())
{
var predictions = prediction.Predictions.ToList();
removePredictionsUnderProbabilityThreshold(predictions);
list = predictions.ConvertAll<PredictedObject>((p) =>
{
return buildPredictedObject(p, image, data);
});
removeUnusableImages(list);
if (result != null)
{
foreach (var predictedObject in list)
{
assignPredictedText2(predictedObject, result);
}
}
}
}
return list;
```
> The code is calling the `GetDetectedObjects` method that was updated above. It takes the returned predictions and and then removes any objects with low prediction probabilities. It also gets the results of the hand written character recognition and assigns these to the detected objects.
1. Take a look to the `Sketch2Code.Api` project.
1. Open the `ObjectDetection.cs` file in the root of the project and review it.
> This class exposes the Azure Function and will create the service and call the methods you just coded. When a response is returned, it saves the results to the storage, which includes the original image, a new image with the predicted objects and a json file with all the tagging information.
### D) Test the function
Lets try the function with all the updated code.
1. In Visual Studio, open the `ObjectDetection.cs` file in the root of the `Sketch2Code.Api` project.
1. Set a breakpoint in the line `if (result != null)` around number 47 to debug the result of the prediction API service operation.
1. Click the green button in the top of Visual Studio to start the project; **make sure that the Sketch2Code.Api project is selected**.
1. A new console window will output the enabled **Http Functions**.
1. Open a new console to make a request to test the function.
1. Change directory to the folder where the sample images are located: `cd Sketch2Code\model`.
1. Call the endpoint by using the following `curl `command :
```bash
curl --request POST --data-binary "@sample_2.png" http://localhost:7071/api/detection
```
> NOTE: It is possible that your function is emulated on a different URL or port. Review the console output of the Azure function to confirm it is in the example above.
1. Go to Visual Studio and wait for the breakpoint to be hit.
1. Inspect the `result` object, you should see a list of all the predicted objects and their locations inside the image.
1. Click the `Continue` button in the top of Visual Studio and wait for the request to finish.
1. At the end should print a GUID identifier.
1. Go back to **Microsoft Edge**.
1. Navigate to the [Azure Portal](https://portal.azure.com/) (https://portal.azure.com/).
1. Go to the created blob storage resource by searching by name in the `All resources` option.
1. Click on the `Storage Explorer (preview)` option of the resource menu in the left.
1. Check the `BLOB CONTAINERS` and click the one created.
1. In the right panel you should see all the created files by the function:
- slices (folder)
- groups.json
- original.png
- predicted.png
- results.json
1. Double-Click the `predicted.png` file to start the download process.
1. Save the file to your computer and open it with any available software.
1. Check all the predicted objects in the image.
## Run the Sketch2Code App
In this section we will see how to setup the app that generates HTML from the model predictions.
### A) Update app settings
1. Return to **Visual Studio** and open the **Web.config** file in the root of the `Sketch2Code.Web` project.
1. Find the `appSettings` section in the file.
1. Replace all the following values with the same values from the **local.settings.json** file inside the **Sketch2Code.Api** project that you set before.
- ObjectDetectionTrainingKeyValue = ObjectDetectionTrainingKey
- ObjectDetectionPredictionKeyValue = ObjectDetectionPredictionKey
- ObjectDetectionProjectNameValue = ObjectDetectionProjectName
- ObjectDetectionIterationNameValue = ObjectDetectionIterationName
- HandwrittenTextSubscriptionKeyValue = HandwrittenTextSubscriptionKey
- HandwrittenTextApiEndpointValue = HandwrittenTextApiEndpoint
- AzureWebJobsStorageValue = AzureWebJobsStorage
1. Make sure that the `Sketch2CodeAppFunctionEndPoint` property has the correct function endpoint URL that you use before to call the function.
1. Now we need to set the value for the `storageUrl` key. Go back to the [Azure Portal](https://portal.azure.com/) (https://portal.azure.com/) in Edge and find the created Blob Storage resource.
1. Confirm the name of the resource and set the value using it all in lowercase of the setting to be: https://RESOURCENAME.blob.core.windows.net. It should be something like https://sketch2sketch2codeblobstorage.blob.core.windows.net
### B) Run the app
Lets try it!
1. Select the `Sketch2Code.Web` program in Visual Studio at the top and click the green button to start the app.
1. A new browser window should be open with the app.
1. Click the `Use this sample` button in the middle of the screen to try the app sample:
![Use this sample button](./images/app_use_this_sample.png).
1. The initial part of the process will upload the sample image and display it in the browser.
1. Then wait for the sketch to code process to finish.
> The message in the window will be: "Working on your Sketch. Please wait..."
1. When finished you should see the message: `It's done!` and the image with the recognized objects on the right.
1. Click the `DOWNLOAD YOUR HTML CODE` to download an `html` file with the generated code.
1. Save the file in your machine and open it with Edge to see it in action!
1. Now let's try with one of the samples in the model.
1. Click the `TRY A NEW DESIGN` link.
1. In the homepage click the `Upload design` button:
![Upload design button](./images/app_upload_design.png).
1. Browse to `Sketch2Code\model` and select the `sample_2.png` image.
1. Wait for the process to finish and do the same to see the generated html output.
> Any new design that you process can be fed back into the training to further improve the model.
1. Bonus: Draw your own design and use a camera to create an image that you can feed into your model.

Просмотреть файл

@ -0,0 +1,100 @@

using Microsoft.Azure.CognitiveServices.Vision.CustomVision.Training;
using Microsoft.Azure.CognitiveServices.Vision.CustomVision.Training.Models;
using Microsoft.ProjectOxford.Vision;
using System;
using System.Collections.Generic;
using System.Configuration;
using System.Linq;
using System.Net.Http;
using System.Text;
using System.Threading.Tasks;
namespace Sketch2Code.AI
{
public abstract class CustomVisionClient
{
protected string _trainingApiKey;
protected string _predictionApiKey;
private TrainingApi _trainingApi;
protected string _projectName;
protected Project _project;
protected Iteration _iteration;
protected VisionServiceClient _visionClient;
public TrainingApi TrainingApi { get => _trainingApi; }
public CustomVisionClient(string trainingKey, string predictionKey, string projectName)
{
_trainingApiKey = trainingKey;
_predictionApiKey = predictionKey;
_projectName = projectName;
this._trainingApi = new TrainingApi() { ApiKey = _trainingApiKey };
_visionClient = new VisionServiceClient(ConfigurationManager.AppSettings["HandwrittenTextSubscriptionKey"],
ConfigurationManager.AppSettings["HandwrittenTextApiEndpoint"]);
}
protected async Task<Project> GetProjectAsync(string projectName)
{
if (String.IsNullOrWhiteSpace(projectName)) throw new ArgumentNullException("projectName");
var projects = await this._trainingApi.GetProjectsAsync();
return projects.SingleOrDefault(p => p.Name.Equals(projectName, StringComparison.InvariantCultureIgnoreCase));
}
public virtual void Initialize()
{
if (String.IsNullOrWhiteSpace(_projectName)) throw new ArgumentNullException("projectName");
var projects = this._trainingApi.GetProjects();
this._project = projects.SingleOrDefault(p => p.Name.Equals(_projectName, StringComparison.InvariantCultureIgnoreCase));
if (_project == null) throw new InvalidOperationException($"CustomVision client failed to initialize. ({_projectName} Not Found.)");
SetDefaultIteration(ConfigurationManager.AppSettings["ObjectDetectionIterationName"]);
}
protected async Task<IList<Iteration>> GetIterations(string projectName)
{
if (String.IsNullOrWhiteSpace(projectName)) throw new ArgumentNullException("projectName");
var prj = await this.GetProjectAsync(projectName);
var iterations = await this._trainingApi.GetIterationsAsync(prj.Id);
return iterations;
}
public virtual async Task SetDefaultIterationAsync(string iterationName)
{
if (_project == null) throw new InvalidOperationException("Project is null");
var iterations = await this._trainingApi.GetIterationsAsync(_project.Id);
var iteration = iterations.SingleOrDefault(i=>i.Name == iterationName);
if (iteration == null) throw new InvalidOperationException($"Iteration {iterationName} not found");
iteration.IsDefault = true;
await _trainingApi.UpdateIterationAsync(_project.Id, iteration.Id, iteration);
}
public virtual void SetDefaultIteration(string iterationName)
{
if (_project == null) throw new InvalidOperationException("Project is null");
var iterations = this._trainingApi.GetIterations(_project.Id);
var iteration = iterations.SingleOrDefault(i => i.Name == iterationName);
if (iteration == null) throw new InvalidOperationException($"Iteration {iterationName} not found");
iteration.IsDefault = true;
this._trainingApi.UpdateIteration(_project.Id, iteration.Id, iteration);
}
}
}

Просмотреть файл

@ -0,0 +1,143 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Text;
using System.Threading.Tasks;
using Microsoft.Azure.CognitiveServices.Vision.CustomVision.Training;
using Microsoft.Azure.CognitiveServices.Vision.CustomVision.Training.Models;
namespace Sketch2Code.AI.Management
{
public class CustomVisionManager
{
CustomVisionClient _apiClient;
public CustomVisionManager(CustomVisionClient client)
{
_apiClient = client;
}
public async Task<Project> CreateProject(string projectName)
{
var project = await _apiClient.TrainingApi.CreateProjectAsync(projectName);
return project;
}
public async Task<Project> GetProject(string projectName)
{
var projects = await _apiClient.TrainingApi.GetProjectsAsync();
var project = projects?.SingleOrDefault(p => p.Name.Equals(projectName, StringComparison.CurrentCultureIgnoreCase));
return project;
}
public async Task<Tag> CreateTag(string tagName, Project project)
{
if (project == null)
throw new ArgumentNullException("project");
var tag = await _apiClient.TrainingApi.CreateTagAsync(project.Id, tagName);
return tag;
}
public async Task<IList<Tag>> GetTags(Project project)
{
try
{
if (project == null)
throw new ArgumentNullException("project");
var tags = await _apiClient.TrainingApi.GetTagsAsync(project.Id);
return tags;
}
catch (Exception ex)
{
throw;
}
}
public async Task<IList<Image>> GetImagesForTraining(Project project, Iteration iteration = null)
{
int defaultPageSize = 50;
int offset = 0;
bool hasRecords = true;
var list = new List<Image>();
while (hasRecords)
{
var images = await _apiClient.TrainingApi.GetTaggedImagesAsync(project.Id, iteration?.Id, skip: offset * defaultPageSize);
offset += 1;
hasRecords = images.Count > 0;
list.AddRange(images);
}
return list;
}
public async Task CreateDataset(Project project, IList<Image> imageDataset)
{
//Get Tags
var tags = await this.GetTags(project);
if (tags!=null && !tags.Any() || tags==null)
{
//Create Tags
var imageTags = imageDataset.SelectMany(i => i.Tags).GroupBy(i => i.TagName).Select(g => g.Key).Distinct();
foreach (var tag in imageTags)
{
var newTag = await this._apiClient.TrainingApi.CreateTagAsync(project.Id, tag);
tags.Add(newTag);
}
}
//Set Regions with created tags
var entries = new List<ImageFileCreateEntry>();
//Create Images With Regions And Tags
foreach (var img in imageDataset)
{
//download image as byte array
using (var client = new WebClient())
{
var buffer = await client.DownloadDataTaskAsync(img.ImageUri);
var regions = img.Regions.ToList().ConvertAll<Region>((imageRegion) =>
{
var tag = tags.SingleOrDefault((t) => t.Name.Equals(imageRegion.TagName, StringComparison.InvariantCultureIgnoreCase));
return new Region
{
Height = imageRegion.Height,
Left = imageRegion.Left,
Top = imageRegion.Top,
Width = imageRegion.Width,
TagId = tag.Id
};
});
entries.Add(new ImageFileCreateEntry
{
Contents = buffer,
Regions = regions,
TagIds = regions.Select(r => r.TagId).ToList()
});
}
}
//Custom vision only allows a max of 64 items as batch size
int batchSize = 64;
var pagedEntries = entries
.Select((e, index) => new { Item = e, Index = index })
.GroupBy(e=>e.Index/batchSize).ToList();
foreach (var entryList in pagedEntries)
{
_apiClient.TrainingApi.CreateImagesFromFiles(project.Id, new ImageFileCreateBatch
{
Images = entryList.Select(e=>e.Item).ToList(),
TagIds = entryList.SelectMany(e => e.Item.TagIds).Distinct().ToList()
});
}
}
}
}

Просмотреть файл

@ -0,0 +1,95 @@
using Microsoft.Azure.CognitiveServices.Vision.CustomVision.Prediction;
using Microsoft.Azure.CognitiveServices.Vision.CustomVision.Prediction.Models;
using Microsoft.ProjectOxford.Vision;
using Microsoft.ProjectOxford.Vision.Contract;
using System;
using System.Collections.Generic;
using System.Configuration;
using System.IO;
using System.Linq;
using System.Threading.Tasks;
namespace Sketch2Code.AI
{
public class ObjectDetector : CustomVisionClient
{
public ObjectDetector()
: base(ConfigurationManager.AppSettings["ObjectDetectionTrainingKey"],
ConfigurationManager.AppSettings["ObjectDetectionPredictionKey"],
ConfigurationManager.AppSettings["ObjectDetectionProjectName"])
{
}
public ObjectDetector(string trainingKey, string predictionKey, string projectName)
: base(trainingKey, predictionKey, projectName)
{
}
public async Task<ImagePrediction> GetDetectedObjects(byte[] image)
{
throw new NotImplementedException();
}
public async Task<List<String>> GetText(byte[] image)
{
var list = new List<String>();
try
{
using (var ms = new MemoryStream(image))
{
var operation = await _visionClient.CreateHandwritingRecognitionOperationAsync(ms);
var result = await _visionClient.GetHandwritingRecognitionOperationResultAsync(operation);
while (result.Status != Microsoft.ProjectOxford.Vision.Contract.HandwritingRecognitionOperationStatus.Succeeded)
{
if (result.Status == Microsoft.ProjectOxford.Vision.Contract.HandwritingRecognitionOperationStatus.Failed)
return new List<string>(new string[] { "Text prediction failed" });
await Task.Delay(Convert.ToInt32(ConfigurationManager.AppSettings["ComputerVisionDelay"]));
result = await _visionClient.GetHandwritingRecognitionOperationResultAsync(operation);
}
list = result.RecognitionResult.Lines.SelectMany(l => l.Words?.Select(w => w.Text)).ToList();
}
}
catch (ClientException ex)
{
list.Add($"Text prediction failed: {ex.Error.Message}. Id: {ex.Error.Code}.");
}
return list;
}
public async Task<HandwritingTextLine[]> GetTextRecognition(byte[] image)
{
try
{
using (var ms = new MemoryStream(image))
{
var operation = await _visionClient.CreateHandwritingRecognitionOperationAsync(ms);
var result = await _visionClient.GetHandwritingRecognitionOperationResultAsync(operation);
while (result.Status != Microsoft.ProjectOxford.Vision.Contract.HandwritingRecognitionOperationStatus.Succeeded)
{
if (result.Status == Microsoft.ProjectOxford.Vision.Contract.HandwritingRecognitionOperationStatus.Failed)
{
return null;
}
await Task.Delay(Convert.ToInt32(ConfigurationManager.AppSettings["ComputerVisionDelay"]));
result = await _visionClient.GetHandwritingRecognitionOperationResultAsync(operation);
}
return result.RecognitionResult.Lines;
}
}
catch (ClientException ex)
{
return null;
}
}
}
}

Просмотреть файл

@ -0,0 +1,36 @@
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
// General Information about an assembly is controlled through the following
// set of attributes. Change these attribute values to modify the information
// associated with an assembly.
[assembly: AssemblyTitle("Sketch2Code.AI")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("Sketch2Code.AI")]
[assembly: AssemblyCopyright("Copyright © 2018")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]
// Setting ComVisible to false makes the types in this assembly not visible
// to COM components. If you need to access a type in this assembly from
// COM, set the ComVisible attribute to true on that type.
[assembly: ComVisible(false)]
// The following GUID is for the ID of the typelib if this project is exposed to COM
[assembly: Guid("47bce6ca-9347-4fb6-900b-770426958083")]
// Version information for an assembly consists of the following four values:
//
// Major Version
// Minor Version
// Build Number
// Revision
//
// You can specify all the values or you can default the Build and Revision Numbers
// by using the '*' as shown below:
// [assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyVersion("1.0.0.0")]
[assembly: AssemblyFileVersion("1.0.0.0")]

Просмотреть файл

@ -0,0 +1,124 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
<PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
<ProjectGuid>{47BCE6CA-9347-4FB6-900B-770426958083}</ProjectGuid>
<OutputType>Library</OutputType>
<AppDesignerFolder>Properties</AppDesignerFolder>
<RootNamespace>Sketch2Code.AI</RootNamespace>
<AssemblyName>Sketch2Code.AI</AssemblyName>
<TargetFrameworkVersion>v4.6.1</TargetFrameworkVersion>
<FileAlignment>512</FileAlignment>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<DebugSymbols>true</DebugSymbols>
<DebugType>full</DebugType>
<Optimize>false</Optimize>
<OutputPath>bin\Debug\</OutputPath>
<DefineConstants>DEBUG;TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
<DebugType>pdbonly</DebugType>
<Optimize>true</Optimize>
<OutputPath>bin\Release\</OutputPath>
<DefineConstants>TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<ItemGroup>
<Reference Include="Microsoft.Azure.CognitiveServices.Vision.CustomVision.Prediction, Version=0.10.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
<HintPath>..\packages\Microsoft.Azure.CognitiveServices.Vision.CustomVision.Prediction.0.10.0-preview\lib\net452\Microsoft.Azure.CognitiveServices.Vision.CustomVision.Prediction.dll</HintPath>
</Reference>
<Reference Include="Microsoft.Azure.CognitiveServices.Vision.CustomVision.Training, Version=0.10.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
<HintPath>..\packages\Microsoft.Azure.CognitiveServices.Vision.CustomVision.Training.0.10.0-preview\lib\net452\Microsoft.Azure.CognitiveServices.Vision.CustomVision.Training.dll</HintPath>
</Reference>
<Reference Include="Microsoft.Azure.KeyVault.Core, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
<HintPath>..\packages\Microsoft.Azure.KeyVault.Core.1.0.0\lib\net40\Microsoft.Azure.KeyVault.Core.dll</HintPath>
</Reference>
<Reference Include="Microsoft.Data.Edm, Version=5.8.1.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
<HintPath>..\packages\Microsoft.Data.Edm.5.8.2\lib\net40\Microsoft.Data.Edm.dll</HintPath>
</Reference>
<Reference Include="Microsoft.Data.OData, Version=5.8.1.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
<HintPath>..\packages\Microsoft.Data.OData.5.8.2\lib\net40\Microsoft.Data.OData.dll</HintPath>
</Reference>
<Reference Include="Microsoft.Data.Services.Client, Version=5.8.1.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
<HintPath>..\packages\Microsoft.Data.Services.Client.5.8.2\lib\net40\Microsoft.Data.Services.Client.dll</HintPath>
</Reference>
<Reference Include="Microsoft.ProjectOxford.Vision, Version=1.0.393.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
<HintPath>..\packages\Microsoft.ProjectOxford.Vision.1.0.393\lib\portable-net45+win+wpa81+wp80+MonoAndroid10+xamarinios10+MonoTouch10\Microsoft.ProjectOxford.Vision.dll</HintPath>
</Reference>
<Reference Include="Microsoft.Rest.ClientRuntime, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
<HintPath>..\packages\Microsoft.Rest.ClientRuntime.2.3.11\lib\net452\Microsoft.Rest.ClientRuntime.dll</HintPath>
</Reference>
<Reference Include="Microsoft.Rest.ClientRuntime.Azure, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
<HintPath>..\packages\Microsoft.Rest.ClientRuntime.Azure.3.3.12\lib\net452\Microsoft.Rest.ClientRuntime.Azure.dll</HintPath>
</Reference>
<Reference Include="Microsoft.WindowsAzure.Storage, Version=8.7.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
<HintPath>..\packages\WindowsAzure.Storage.8.7.0\lib\net45\Microsoft.WindowsAzure.Storage.dll</HintPath>
</Reference>
<Reference Include="Newtonsoft.Json, Version=9.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL">
<HintPath>..\packages\Newtonsoft.Json.9.0.1\lib\net45\Newtonsoft.Json.dll</HintPath>
</Reference>
<Reference Include="System" />
<Reference Include="System.Configuration" />
<Reference Include="System.Core" />
<Reference Include="System.Data.OracleClient" />
<Reference Include="System.Drawing" />
<Reference Include="System.Net" />
<Reference Include="System.Net.Http, Version=4.1.1.2, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
<HintPath>..\packages\System.Net.Http.4.3.3\lib\net46\System.Net.Http.dll</HintPath>
</Reference>
<Reference Include="System.Net.Http.WebRequest" />
<Reference Include="System.Security.AccessControl, Version=4.1.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
<HintPath>..\packages\System.Security.AccessControl.4.5.0\lib\net461\System.Security.AccessControl.dll</HintPath>
</Reference>
<Reference Include="System.Security.Cryptography.Algorithms, Version=4.1.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
<HintPath>..\packages\System.Security.Cryptography.Algorithms.4.3.0\lib\net461\System.Security.Cryptography.Algorithms.dll</HintPath>
</Reference>
<Reference Include="System.Security.Cryptography.Encoding, Version=4.0.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
<HintPath>..\packages\System.Security.Cryptography.Encoding.4.3.0\lib\net46\System.Security.Cryptography.Encoding.dll</HintPath>
</Reference>
<Reference Include="System.Security.Cryptography.Primitives, Version=4.0.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
<HintPath>..\packages\System.Security.Cryptography.Primitives.4.3.0\lib\net46\System.Security.Cryptography.Primitives.dll</HintPath>
</Reference>
<Reference Include="System.Security.Cryptography.X509Certificates, Version=4.1.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
<HintPath>..\packages\System.Security.Cryptography.X509Certificates.4.3.0\lib\net461\System.Security.Cryptography.X509Certificates.dll</HintPath>
</Reference>
<Reference Include="System.Security.Permissions, Version=4.0.1.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
<HintPath>..\packages\System.Security.Permissions.4.5.0\lib\net461\System.Security.Permissions.dll</HintPath>
</Reference>
<Reference Include="System.Security.Principal.Windows, Version=4.1.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
<HintPath>..\packages\System.Security.Principal.Windows.4.5.0\lib\net461\System.Security.Principal.Windows.dll</HintPath>
</Reference>
<Reference Include="System.ServiceProcess" />
<Reference Include="System.Spatial, Version=5.8.1.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
<HintPath>..\packages\System.Spatial.5.8.2\lib\net40\System.Spatial.dll</HintPath>
</Reference>
<Reference Include="System.Transactions" />
<Reference Include="System.Xml.Linq" />
<Reference Include="System.Data.DataSetExtensions" />
<Reference Include="Microsoft.CSharp" />
<Reference Include="System.Data" />
<Reference Include="System.Xml" />
</ItemGroup>
<ItemGroup>
<Compile Include="CustomVisionClient.cs" />
<Compile Include="Management\CustomVisionManager.cs" />
<Compile Include="ObjectDetector.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
</ItemGroup>
<ItemGroup>
<None Include="app.config" />
<None Include="packages.config" />
</ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<Import Project="..\packages\Microsoft.Bcl.Build.1.0.14\tools\Microsoft.Bcl.Build.targets" Condition="Exists('..\packages\Microsoft.Bcl.Build.1.0.14\tools\Microsoft.Bcl.Build.targets')" />
<Target Name="EnsureBclBuildImported" BeforeTargets="BeforeBuild" Condition="'$(BclBuildImported)' == ''">
<Error Condition="!Exists('..\packages\Microsoft.Bcl.Build.1.0.14\tools\Microsoft.Bcl.Build.targets')" Text="This project references NuGet package(s) that are missing on this computer. Enable NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=317567." HelpKeyword="BCLBUILD2001" />
<Error Condition="Exists('..\packages\Microsoft.Bcl.Build.1.0.14\tools\Microsoft.Bcl.Build.targets')" Text="The build restored NuGet packages. Build the project again to include these packages in the build. For more information, see http://go.microsoft.com/fwlink/?LinkID=317568." HelpKeyword="BCLBUILD2002" />
</Target>
</Project>

Просмотреть файл

@ -0,0 +1,15 @@
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="Newtonsoft.Json" publicKeyToken="30ad4fe6b2a6aeed" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-9.0.0.0" newVersion="9.0.0.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Net.Http" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.1.1.2" newVersion="4.1.1.2" />
</dependentAssembly>
</assemblyBinding>
</runtime>
</configuration>

Просмотреть файл

@ -0,0 +1,29 @@
<?xml version="1.0" encoding="utf-8"?>
<packages>
<package id="Microsoft.Azure.CognitiveServices.Vision.CustomVision.Prediction" version="0.10.0-preview" targetFramework="net461" />
<package id="Microsoft.Azure.CognitiveServices.Vision.CustomVision.Training" version="0.10.0-preview" targetFramework="net461" />
<package id="Microsoft.Azure.KeyVault.Core" version="1.0.0" targetFramework="net461" />
<package id="Microsoft.Bcl" version="1.1.10" targetFramework="net461" />
<package id="Microsoft.Bcl.Build" version="1.0.14" targetFramework="net461" />
<package id="Microsoft.Data.Edm" version="5.8.4" targetFramework="net461" />
<package id="Microsoft.Data.OData" version="5.8.4" targetFramework="net461" />
<package id="Microsoft.Data.Services.Client" version="5.8.4" targetFramework="net461" />
<package id="Microsoft.ProjectOxford.Vision" version="1.0.393" targetFramework="net461" />
<package id="Microsoft.Rest.ClientRuntime" version="2.3.11" targetFramework="net461" />
<package id="Microsoft.Rest.ClientRuntime.Azure" version="3.3.12" targetFramework="net461" />
<package id="Newtonsoft.Json" version="9.0.1" targetFramework="net461" />
<package id="System.ComponentModel.EventBasedAsync" version="4.0.11" targetFramework="net461" />
<package id="System.Dynamic.Runtime" version="4.0.0" targetFramework="net461" />
<package id="System.Linq.Queryable" version="4.0.0" targetFramework="net461" />
<package id="System.Net.Http" version="4.3.3" targetFramework="net461" />
<package id="System.Net.Requests" version="4.0.11" targetFramework="net461" />
<package id="System.Security.AccessControl" version="4.5.0" targetFramework="net461" />
<package id="System.Security.Cryptography.Algorithms" version="4.3.0" targetFramework="net461" />
<package id="System.Security.Cryptography.Encoding" version="4.3.0" targetFramework="net461" />
<package id="System.Security.Cryptography.Primitives" version="4.3.0" targetFramework="net461" />
<package id="System.Security.Cryptography.X509Certificates" version="4.3.0" targetFramework="net461" />
<package id="System.Security.Permissions" version="4.5.0" targetFramework="net461" />
<package id="System.Security.Principal.Windows" version="4.5.0" targetFramework="net461" />
<package id="System.Spatial" version="5.8.2" targetFramework="net461" />
<package id="WindowsAzure.Storage" version="8.7.0" targetFramework="net461" />
</packages>

264
sketch2code/Sketch2Code.Api/.gitignore поставляемый Normal file
Просмотреть файл

@ -0,0 +1,264 @@
## Ignore Visual Studio temporary files, build results, and
## files generated by popular Visual Studio add-ons.
# Azure Functions localsettings file
local.settings.json
# User-specific files
*.suo
*.user
*.userosscache
*.sln.docstates
# User-specific files (MonoDevelop/Xamarin Studio)
*.userprefs
# Build results
[Dd]ebug/
[Dd]ebugPublic/
[Rr]elease/
[Rr]eleases/
x64/
x86/
bld/
[Bb]in/
[Oo]bj/
[Ll]og/
# Visual Studio 2015 cache/options directory
.vs/
# Uncomment if you have tasks that create the project's static files in wwwroot
#wwwroot/
# MSTest test Results
[Tt]est[Rr]esult*/
[Bb]uild[Ll]og.*
# NUNIT
*.VisualState.xml
TestResult.xml
# Build Results of an ATL Project
[Dd]ebugPS/
[Rr]eleasePS/
dlldata.c
# DNX
project.lock.json
project.fragment.lock.json
artifacts/
*_i.c
*_p.c
*_i.h
*.ilk
*.meta
*.obj
*.pch
*.pdb
*.pgc
*.pgd
*.rsp
*.sbr
*.tlb
*.tli
*.tlh
*.tmp
*.tmp_proj
*.log
*.vspscc
*.vssscc
.builds
*.pidb
*.svclog
*.scc
# Chutzpah Test files
_Chutzpah*
# Visual C++ cache files
ipch/
*.aps
*.ncb
*.opendb
*.opensdf
*.sdf
*.cachefile
*.VC.db
*.VC.VC.opendb
# Visual Studio profiler
*.psess
*.vsp
*.vspx
*.sap
# TFS 2012 Local Workspace
$tf/
# Guidance Automation Toolkit
*.gpState
# ReSharper is a .NET coding add-in
_ReSharper*/
*.[Rr]e[Ss]harper
*.DotSettings.user
# JustCode is a .NET coding add-in
.JustCode
# TeamCity is a build add-in
_TeamCity*
# DotCover is a Code Coverage Tool
*.dotCover
# NCrunch
_NCrunch_*
.*crunch*.local.xml
nCrunchTemp_*
# MightyMoose
*.mm.*
AutoTest.Net/
# Web workbench (sass)
.sass-cache/
# Installshield output folder
[Ee]xpress/
# DocProject is a documentation generator add-in
DocProject/buildhelp/
DocProject/Help/*.HxT
DocProject/Help/*.HxC
DocProject/Help/*.hhc
DocProject/Help/*.hhk
DocProject/Help/*.hhp
DocProject/Help/Html2
DocProject/Help/html
# Click-Once directory
publish/
# Publish Web Output
*.[Pp]ublish.xml
*.azurePubxml
# TODO: Comment the next line if you want to checkin your web deploy settings
# but database connection strings (with potential passwords) will be unencrypted
#*.pubxml
*.publishproj
# Microsoft Azure Web App publish settings. Comment the next line if you want to
# checkin your Azure Web App publish settings, but sensitive information contained
# in these scripts will be unencrypted
PublishScripts/
# NuGet Packages
*.nupkg
# The packages folder can be ignored because of Package Restore
**/packages/*
# except build/, which is used as an MSBuild target.
!**/packages/build/
# Uncomment if necessary however generally it will be regenerated when needed
#!**/packages/repositories.config
# NuGet v3's project.json files produces more ignoreable files
*.nuget.props
*.nuget.targets
# Microsoft Azure Build Output
csx/
*.build.csdef
# Microsoft Azure Emulator
ecf/
rcf/
# Windows Store app package directories and files
AppPackages/
BundleArtifacts/
Package.StoreAssociation.xml
_pkginfo.txt
# Visual Studio cache files
# files ending in .cache can be ignored
*.[Cc]ache
# but keep track of directories ending in .cache
!*.[Cc]ache/
# Others
ClientBin/
~$*
*~
*.dbmdl
*.dbproj.schemaview
*.jfm
*.pfx
*.publishsettings
node_modules/
orleans.codegen.cs
# Since there are multiple workflows, uncomment next line to ignore bower_components
# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622)
#bower_components/
# RIA/Silverlight projects
Generated_Code/
# Backup & report files from converting an old project file
# to a newer Visual Studio version. Backup files are not needed,
# because we have git ;-)
_UpgradeReport_Files/
Backup*/
UpgradeLog*.XML
UpgradeLog*.htm
# SQL Server files
*.mdf
*.ldf
# Business Intelligence projects
*.rdl.data
*.bim.layout
*.bim_*.settings
# Microsoft Fakes
FakesAssemblies/
# GhostDoc plugin setting file
*.GhostDoc.xml
# Node.js Tools for Visual Studio
.ntvs_analysis.dat
# Visual Studio 6 build log
*.plg
# Visual Studio 6 workspace options file
*.opt
# Visual Studio LightSwitch build output
**/*.HTMLClient/GeneratedArtifacts
**/*.DesktopClient/GeneratedArtifacts
**/*.DesktopClient/ModelManifest.xml
**/*.Server/GeneratedArtifacts
**/*.Server/ModelManifest.xml
_Pvt_Extensions
# Paket dependency manager
.paket/paket.exe
paket-files/
# FAKE - F# Make
.fake/
# JetBrains Rider
.idea/
*.sln.iml
# CodeRush
.cr/
# Python Tools for Visual Studio (PTVS)
__pycache__/
*.pyc

Просмотреть файл

@ -0,0 +1,59 @@
using System;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Text;
using System.Threading.Tasks;
using Sketch2Code.AI;
using Sketch2Code.Core;
using Microsoft.Azure.WebJobs;
using Microsoft.Azure.WebJobs.Extensions.Http;
using Microsoft.Azure.WebJobs.Host;
using Newtonsoft.Json;
using Westwind.RazorHosting;
using Sketch2Code.Core.Helpers;
using System.Globalization;
using Microsoft.Extensions.Logging;
using System.Configuration;
using Freezer.Core;
using Microsoft.ApplicationInsights;
using System.Diagnostics;
using System.Collections.Generic;
using Microsoft.ApplicationInsights.DataContracts;
namespace Sketch2Code.Api
{
public static class ObjectDetection
{
[FunctionName("detection")]
public static async Task<HttpResponseMessage> Run([HttpTrigger(AuthorizationLevel.Function, "post", Route = null)]HttpRequestMessage req, TraceWriter log)
{
//Get image byte array from request
var content = await req.Content.ReadAsByteArrayAsync();
if (content == null || content.Length == 0)
return req.CreateResponse(HttpStatusCode.BadRequest, "Request content is empty.");
else
log.Info($"found binary content->Size: {content.Length} bytes");
//Use correlationId to identify each session and results
var correlationID = req.GetCorrelationId().ToString();
//Pass byte array to object detector app service
var objectDetector = new ObjectDetectionAppService();
var result = await objectDetector.GetPredictionAsync(content);
if (result != null)
{
await objectDetector.SaveResults(result, correlationID);
await objectDetector.SaveResults(content, correlationID, "original.png");
await objectDetector.SaveResults(content.DrawRectangle(result), correlationID, "predicted.png");
byte[] jsonContent = Encoding.UTF8.GetBytes(JsonConvert.SerializeObject(result));
await objectDetector.SaveResults(jsonContent, correlationID, "results.json");
}
return req.CreateResponse(HttpStatusCode.OK, correlationID);
}
}
}

Просмотреть файл

@ -0,0 +1,33 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net461</TargetFramework>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="BootstrapMvc.Bootstrap3Mvc5" Version="2.3.1" />
<PackageReference Include="Freezer" Version="1.0.1.5" />
<PackageReference Include="Microsoft.Azure.WebJobs.Logging.ApplicationInsights" Version="2.2.0" />
<PackageReference Include="Microsoft.Extensions.Logging" Version="2.1.1" />
<PackageReference Include="Microsoft.NET.Sdk.Functions" Version="1.0.13" />
<PackageReference Include="Westwind.RazorHosting" Version="3.3.0" />
<PackageReference Include="WindowsAzure.Storage" Version="8.7.0" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\Sketch2Code.Core\Sketch2Code.Core.csproj" />
</ItemGroup>
<ItemGroup>
<Reference Include="Microsoft.CSharp" />
<Reference Include="System.Configuration" />
</ItemGroup>
<ItemGroup>
<None Update="host.json">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Update="local.settings.json">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
<CopyToPublishDirectory>Never</CopyToPublishDirectory>
</None>
</ItemGroup>
<ItemGroup>
<Folder Include="Properties\" />
</ItemGroup>
</Project>

Просмотреть файл

@ -0,0 +1,3 @@
{
}

Просмотреть файл

@ -0,0 +1,71 @@
<?xml version="1.0" encoding="utf-8"?>
<ApplicationInsights xmlns="http://schemas.microsoft.com/ApplicationInsights/2013/Settings">
<TelemetryInitializers>
<Add Type="Microsoft.ApplicationInsights.DependencyCollector.HttpDependenciesParsingTelemetryInitializer, Microsoft.AI.DependencyCollector"/>
<Add Type="Microsoft.ApplicationInsights.WindowsServer.AzureRoleEnvironmentTelemetryInitializer, Microsoft.AI.WindowsServer"/>
<Add Type="Microsoft.ApplicationInsights.WindowsServer.AzureWebAppRoleEnvironmentTelemetryInitializer, Microsoft.AI.WindowsServer"/>
<Add Type="Microsoft.ApplicationInsights.WindowsServer.BuildInfoConfigComponentVersionTelemetryInitializer, Microsoft.AI.WindowsServer"/>
</TelemetryInitializers>
<TelemetryModules>
<Add Type="Microsoft.ApplicationInsights.DependencyCollector.DependencyTrackingTelemetryModule, Microsoft.AI.DependencyCollector">
<ExcludeComponentCorrelationHttpHeadersOnDomains>
<!--
Requests to the following hostnames will not be modified by adding correlation headers.
This is only applicable if Profiler is installed via either StatusMonitor or Azure Extension.
Add entries here to exclude additional hostnames.
NOTE: this configuration will be lost upon NuGet upgrade.
-->
<Add>core.windows.net</Add>
<Add>core.chinacloudapi.cn</Add>
<Add>core.cloudapi.de</Add>
<Add>core.usgovcloudapi.net</Add>
<Add>localhost</Add>
<Add>127.0.0.1</Add>
</ExcludeComponentCorrelationHttpHeadersOnDomains>
</Add>
<Add Type="Microsoft.ApplicationInsights.Extensibility.PerfCounterCollector.PerformanceCollectorModule, Microsoft.AI.PerfCounterCollector">
<!--
Use the following syntax here to collect additional performance counters:
<Counters>
<Add PerformanceCounter="\Process(??APP_WIN32_PROC??)\Handle Count" ReportAs="Process handle count" />
...
</Counters>
PerformanceCounter must be either \CategoryName(InstanceName)\CounterName or \CategoryName\CounterName
NOTE: performance counters configuration will be lost upon NuGet upgrade.
The following placeholders are supported as InstanceName:
??APP_WIN32_PROC?? - instance name of the application process for Win32 counters.
??APP_W3SVC_PROC?? - instance name of the application IIS worker process for IIS/ASP.NET counters.
??APP_CLR_PROC?? - instance name of the application CLR process for .NET counters.
-->
</Add>
<Add Type="Microsoft.ApplicationInsights.Extensibility.PerfCounterCollector.QuickPulse.QuickPulseTelemetryModule, Microsoft.AI.PerfCounterCollector"/>
<Add Type="Microsoft.ApplicationInsights.WindowsServer.DeveloperModeWithDebuggerAttachedTelemetryModule, Microsoft.AI.WindowsServer"/>
<Add Type="Microsoft.ApplicationInsights.WindowsServer.UnhandledExceptionTelemetryModule, Microsoft.AI.WindowsServer"/>
<Add Type="Microsoft.ApplicationInsights.WindowsServer.UnobservedExceptionTelemetryModule, Microsoft.AI.WindowsServer">
<!--</Add>
<Add Type="Microsoft.ApplicationInsights.WindowsServer.FirstChanceExceptionStatisticsTelemetryModule, Microsoft.AI.WindowsServer">-->
</Add>
</TelemetryModules>
<TelemetryProcessors>
<Add Type="Microsoft.ApplicationInsights.Extensibility.PerfCounterCollector.QuickPulse.QuickPulseTelemetryProcessor, Microsoft.AI.PerfCounterCollector"/>
<Add Type="Microsoft.ApplicationInsights.Extensibility.AutocollectedMetricsExtractor, Microsoft.ApplicationInsights"/>
<Add Type="Microsoft.ApplicationInsights.WindowsServer.TelemetryChannel.AdaptiveSamplingTelemetryProcessor, Microsoft.AI.ServerTelemetryChannel">
<MaxTelemetryItemsPerSecond>5</MaxTelemetryItemsPerSecond>
<ExcludedTypes>Event</ExcludedTypes>
</Add>
<Add Type="Microsoft.ApplicationInsights.WindowsServer.TelemetryChannel.AdaptiveSamplingTelemetryProcessor, Microsoft.AI.ServerTelemetryChannel">
<MaxTelemetryItemsPerSecond>5</MaxTelemetryItemsPerSecond>
<IncludedTypes>Event</IncludedTypes>
</Add>
</TelemetryProcessors>
<TelemetryChannel Type="Microsoft.ApplicationInsights.WindowsServer.TelemetryChannel.ServerTelemetryChannel, Microsoft.AI.ServerTelemetryChannel"/>
<!--
Learn more about Application Insights configuration with ApplicationInsights.config here:
http://go.microsoft.com/fwlink/?LinkID=513840
Note: If not present, please add <InstrumentationKey>Your Key</InstrumentationKey> to the top of this file.
--></ApplicationInsights>

Просмотреть файл

@ -0,0 +1,441 @@
using Sketch2Code.Core.Entities;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Sketch2Code.Core.BoxGeometry
{
public class Geometry
{
public void AlignTop(List<BoundingBox> testBoxes)
{
double average = testBoxes.Average(p => p.Top);
foreach (BoundingBox b in testBoxes)
{
b.Top = average;
}
}
public void AlignLeft(List<BoundingBox> testBoxes)
{
double average = testBoxes.Average(p => p.Left);
foreach (BoundingBox b in testBoxes)
{
b.Left = average;
}
}
public void MakeSameSize(List<BoundingBox> testBoxes)
{
double wAvg = testBoxes.Average(p => p.Width);
double hAvg = testBoxes.Average(p => p.Height);
foreach (BoundingBox b in testBoxes)
{
b.Height = hAvg;
b.Width = wAvg;
}
}
public bool IsBoxInVerticalRange(BoundingBox master, BoundingBox child)
{
return child.MiddleHeight > master.Top && child.MiddleHeight < (master.Top + master.Height);
}
public bool IsBoxInHorizontalRange(BoundingBox master, BoundingBox child)
{
return child.MiddleWidth > master.Top && child.MiddleWidth < (master.Left + master.Width);
}
public ProjectionRuler BuildProjectionRuler(List<BoundingBox> boxes, ProjectionAxisEnum axis)
{
ProjectionRuler ruler = new ProjectionRuler();
List<SliceSection> slices = buildSlices(boxes, axis);
fillSlices(boxes, slices,axis);
Section s = new Section();
s.Slices.Add(slices[0]);
ruler.Sections.Add(s);
bool isEmpty = false;
for (int i = 1; i < slices.Count; i++)
{
if (!isEmpty)
{
if (slices[i].IsEmpty)
{
//close previous section
s = new Section();
s.Slices.Add(slices[i]);
isEmpty = true;
ruler.Sections.Add(s);
}
else
{
//modify previous section
s.Slices.Add(slices[i]);
}
}
else
{
if (!slices[i].IsEmpty)
{
//close previous section
s = new Section();
s.Slices.Add(slices[i]);
isEmpty = false;
ruler.Sections.Add(s);
}
else
{
//modify previous section
s.Slices.Add(slices[i]);
}
}
}
return ruler;
}
private static void fillSlices(List<BoundingBox> boxes, List<SliceSection> slices, ProjectionAxisEnum axis)
{
int first;
int last;
//fill departments
foreach (BoundingBox b in boxes)
{
if (axis == ProjectionAxisEnum.Y)
{
first = slices.FindIndex(p => (p.Start <= b.Top) && (p.End >= b.Top));
last = slices.FindIndex(p => (p.End >= b.Top + b.Height));
}
else
{
first = slices.FindIndex(p => (p.Start <= b.Left) && (p.End >= b.Left));
last = slices.FindIndex(p => (p.End >= b.Left + b.Width));
}
for (int i = first; i <= last; i++)
{
slices[i].IsEmpty = false;
slices[i].Boxes.Add(b);
}
}
}
private static List<SliceSection> buildSlices(List<BoundingBox> boxes, ProjectionAxisEnum axis)
{
double precision = 1000;
double min;
double max;
if (axis == ProjectionAxisEnum.Y)
{
//calculate minimum
min = boxes.Min(p => p.Top);
//calculate maximum
max = boxes.Max(p => p.Top + p.Height);
}
else
{
//calculate minimum
min = boxes.Min(p => p.Left);
//calculate maximum
max = boxes.Max(p => p.Left + p.Width);
}
//make departments
double sliceSize = (max - min) / precision;
List<SliceSection> slices = new List<SliceSection>();
for (double i = min; i < max; i = i + sliceSize)
{
SliceSection slice = new SliceSection();
slice.Start = i;
slice.End = i + sliceSize;
slice.IsEmpty = true;
slices.Add(slice);
}
return slices;
}
public GroupBox BuildGroups(List<BoundingBox> boxes)
{
GroupBox root = new GroupBox();
root.Direction = GroupBox.GroupDirectionEnum.Vertical;
BuildChildGroups(boxes, ProjectionAxisEnum.Y, root);
return root.Groups[0];
}
public void BuildChildGroups(List<BoundingBox> boxes, ProjectionAxisEnum axis, GroupBox parent)
{
GroupBox g = new GroupBox();
g.IsEmpty = false;
if (axis == ProjectionAxisEnum.X)
{
g.Direction = GroupBox.GroupDirectionEnum.Horizontal;
}
else
{
g.Direction = GroupBox.GroupDirectionEnum.Vertical;
}
parent.Groups.Add(g);
if (boxes.Count > 1)
{
g.X = boxes.Min(p => p.Left);
g.Y = boxes.Min(p => p.Top);
g.Width = boxes.Max(p => p.Width);
g.Height = boxes.Max(p => p.Height);
ProjectionRuler ruler = BuildProjectionRuler(boxes, axis);
foreach (Section sec in ruler.Sections)
{
if (axis == ProjectionAxisEnum.X)
{
BuildChildGroups(sec.Boxes, ProjectionAxisEnum.Y, g);
}
else
{
BuildChildGroups(sec.Boxes, ProjectionAxisEnum.X, g);
}
}
}
else
{
if (boxes.Count == 0)
{
g.IsEmpty = true;
}
if (boxes.Count == 1)
{
g.X = boxes.Min(p => p.Left);
g.Y = boxes.Min(p => p.Top);
g.Width = boxes.Max(p => p.Width);
g.Height = boxes.Max(p => p.Height);
//Add the box to the structure
g.Boxes.Add(boxes[0]);
CalculateAlignments(g);
}
}
}
public void DeleteOverlapping(List<BoundingBox> boxes)
{
List<BoundingBox> toDelete = new List<BoundingBox>();
Overlap ovl = new Overlap();
foreach (BoundingBox outer in boxes)
{
foreach (BoundingBox inner in boxes)
{
if (outer != inner)
{
if (ovl.OverlapArea(outer, inner) > .75)
{
//delete the one with lower probability
if (outer.PredictedObject.Probability > inner.PredictedObject.Probability)
{
toDelete.Add(inner);
}
else
{
toDelete.Add(outer);
}
}
}
}
}
foreach (BoundingBox b in toDelete)
{
boxes.Remove(b);
}
}
public void RemoveOverlappingOld(List<BoundingBox> boxes)
{
const int TO_MOVE = 50;
Overlap ovl = new Overlap();
DeleteOverlapping(boxes);
boxes = boxes.OrderBy(p => p.Top).ToList();
foreach (BoundingBox outer in boxes)
{
foreach (BoundingBox inner in boxes)
{
if (outer != inner)
{
if (ovl.OverlapArea(outer, inner) > 0)
{
double ovl_x = ovl.OverlapAreaX(outer, inner);
double ovl_y = ovl.OverlapAreaY(outer, inner);
if (ovl_y > ovl_x)
{
//Move inner to the right
if (inner.Left > outer.Left)
{
inner.Left = outer.Left + outer.Width + TO_MOVE;
}
else
{
outer.Left = inner.Left + inner.Width + TO_MOVE;
}
}
else
{
if (inner.Top > outer.Top)
{
//Move inner to the bottom
inner.Top = outer.Top + outer.Height + TO_MOVE;
}
else
{
//Move outer to the bottom
outer.Top = inner.Top + inner.Height + TO_MOVE;
}
//Move everything down 100
List<BoundingBox> toMove = boxes.Where(p => p.Top > inner.Top + inner.Height).ToList();
foreach (BoundingBox b in toMove)
{
b.Top = b.Top + TO_MOVE;
}
}
}
}
}
}
}
public void RemoveOverlapping(List<BoundingBox> boxes)
{
RemoveOverlappingY(boxes);
RemoveOverlappingX(boxes);
DeleteOverlapping(boxes);
}
public void RemoveOverlappingY(List<BoundingBox> boxes)
{
const int TO_MOVE = 50;
Overlap ovl = new Overlap();
boxes = boxes.OrderBy(p => p.Top).ToList();
for (int i = 0; i < boxes.Count; i++)
{
BoundingBox outer = boxes[i];
for (int j = i+1; j < boxes.Count; j++)
{
BoundingBox inner = boxes[j];
if (ovl.OverlapAreaY(outer, inner) < .75)
{
if (ovl.OverlapAreaY(outer, inner) < .25)
{
//move down
inner.Top = inner.Top + TO_MOVE;
}
if (ovl.OverlapArea(outer, inner) > 0)
{
//move down
inner.Top = outer.Top + outer.Height + TO_MOVE;
}
}
}
}
}
public void RemoveOverlappingX(List<BoundingBox> boxes)
{
const int TO_MOVE = 50;
Overlap ovl = new Overlap();
boxes = boxes.OrderBy(p => p.Left).ToList();
for (int i = 0; i < boxes.Count; i++)
{
BoundingBox outer = boxes[i];
for (int j = i + 1; j < boxes.Count; j++)
{
BoundingBox inner = boxes[j];
if (ovl.OverlapAreaX(outer, inner) < .75)
{
if (ovl.OverlapAreaX(outer, inner) < .25)
{
//move down
inner.Left = inner.Left + TO_MOVE;
}
if (ovl.OverlapArea(outer, inner) > 0)
{
//move down
inner.Left = outer.Left + outer.Width + TO_MOVE;
}
}
}
}
}
public void CalculateAlignments(GroupBox g)
{
if (g.Direction == GroupBox.GroupDirectionEnum.Horizontal && g.Boxes.Count == 1)
{
//calculate alignment
BoundingBox b = g.Boxes[0];
double center_b = (b.Width / 2) + b.Left;
double center_g_steps = b.MaxWidth / 3;
if (center_b < center_g_steps)
{
g.Alignment = GroupBox.GroupAlignmentEnum.Left;
}
else
{
if (center_b > center_g_steps & center_b < center_g_steps * 2)
{
g.Alignment = GroupBox.GroupAlignmentEnum.Center;
}
else
{
g.Alignment = GroupBox.GroupAlignmentEnum.Right;
}
}
}
}
}
}

Просмотреть файл

@ -0,0 +1,56 @@
using Sketch2Code.Core.Entities;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
namespace Sketch2Code.Core.BoxGeometry
{
[DataContract]
public class GroupBox
{
private List<BoundingBox> boxes;
public enum GroupDirectionEnum { Horizontal, Vertical }
public enum GroupAlignmentEnum { Left, Center, Right}
private GroupDirectionEnum direction;
[DataMember]
public bool IsEmpty;
[DataMember]
public double X;
[DataMember]
public double Y;
[DataMember]
public double Height;
[DataMember]
public double Width;
[DataMember]
public GroupAlignmentEnum Alignment;
public int Count
{
get { return Boxes.Count; }
}
[DataMember]
public List<BoundingBox> Boxes
{
get { return boxes; }
set { boxes = value; }
}
[DataMember]
public GroupDirectionEnum Direction
{
get { return direction; }
set { direction = value; }
}
public GroupBox()
{
Boxes = new List<BoundingBox>();
this.Groups = new List<GroupBox>();
}
[DataMember]
public List<GroupBox> Groups { get; set; }
}
}

Просмотреть файл

@ -0,0 +1,77 @@
using Sketch2Code.Core.Entities;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Sketch2Code.Core.BoxGeometry
{
public class Overlap
{
const double MARGIN = 0;
public double OverlapArea(BoundingBox b1, BoundingBox b2)
{
double x_overlap = CalculateOverlapX(b1.Left, b1.Width, b2.Left, b2.Width);
double y_overlap = CalculateOverlapY(b1.Top, b1.Height, b2.Top, b2.Height);
double b1_area = b1.Height * b1.Width;
double b2_area = b2.Height * b2.Width;
//Calculate percentage over smaller box
if (b1_area < b2_area)
{
return (x_overlap * y_overlap / b1_area);
}
else
{
return (x_overlap * y_overlap / b2_area);
}
}
public double OverlapAreaX(BoundingBox b1, BoundingBox b2)
{
double x_overlap = CalculateOverlapX(b1.Left, b1.Width, b2.Left, b2.Width);
double b1_area = b1.Width;
double b2_area = b2.Width;
if (b1_area < b2_area)
{
return (x_overlap / b1_area);
}
else
{
return (x_overlap / b2_area);
}
}
public double OverlapAreaY(BoundingBox b1, BoundingBox b2)
{
double y_overlap = CalculateOverlapY(b1.Top, b1.Height, b2.Top, b2.Height);
double b1_area = b1.Height;
double b2_area = b2.Height;
if (b1_area < b2_area)
{
return (y_overlap / b1_area);
}
else
{
return (y_overlap / b2_area);
}
}
private static double CalculateOverlapX(double b1_left, double b1_width, double b2_left, double b2_width)
{
return Math.Max(0, Math.Min(b1_left + b1_width + MARGIN, b2_left + b2_width) - Math.Max(b1_left, b2_left));
}
private static double CalculateOverlapY(double b1_top, double b1_height, double b2_top, double b2_height)
{
return Math.Max(0, Math.Min(b1_top + b1_height + MARGIN, b2_top + b2_height) - Math.Max(b1_top, b2_top));
}
}
}

Просмотреть файл

@ -0,0 +1,14 @@
using System.Collections.Generic;
namespace Sketch2Code.Core.BoxGeometry
{
public enum ProjectionAxisEnum
{
X,Y
}
public class ProjectionRuler
{
public List<Section> Sections = new List<Section>();
}
}

Просмотреть файл

@ -0,0 +1,50 @@
using Sketch2Code.Core.Entities;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Sketch2Code.Core.BoxGeometry
{
public class Section
{
public double Start
{
get
{
return Slices[0].Start;
}
}
public double End
{
get
{
return Slices[Slices.Count - 1].End;
}
}
public bool IsEmpty { get { return Slices[0].IsEmpty; } }
public List<SliceSection> Slices = new List<SliceSection>();
public List<BoundingBox> Boxes
{
get
{
List<BoundingBox> boxes = new List<BoundingBox>();
foreach (SliceSection slice in Slices)
{
boxes.AddRange(slice.Boxes);
}
boxes = boxes.Distinct().ToList();
return boxes;
}
}
}
}

Просмотреть файл

@ -0,0 +1,17 @@
using Sketch2Code.Core.Entities;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Sketch2Code.Core.BoxGeometry
{
public class SliceSection
{
public double Start;
public double End;
public bool IsEmpty = true;
public List<BoundingBox> Boxes = new List<BoundingBox>();
}
}

Просмотреть файл

@ -0,0 +1,161 @@
using Sketch2Code.Core.Helpers;
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Linq;
using System.Runtime.Serialization;
using System.Text;
using System.Threading.Tasks;
namespace Sketch2Code.Core.Entities
{
[DataContract(IsReference = true)]
public class PredictedObject
{
string _className;
public PredictedObject()
{
this.BoundingBox = new BoundingBox();
}
[DataMember]
public string ClassName
{
get
{
return _className;
}
set
{
_className = value;
if (ImageHelper.Colors.ContainsKey(value))
this.BoundingBox.BoxColor = ImageHelper.Colors[value];
else
this.BoundingBox.BoxColor = Brushes.Green;
}
}
[DataMember]
public double Probability { get; set; }
[DataMember]
public BoundingBox BoundingBox { get; set; }
[DataMember]
public IList<string> Text { get; set; }
public byte[] SlicedImage { get; set; }
[DataMember]
public string Name { get; set; }
[DataMember]
public string FileName { get; set; }
public override string ToString()
{
return $"Top: {this.BoundingBox.Top} - Left: {this.BoundingBox.Left} - Width: {this.BoundingBox.Width} - Height: {this.BoundingBox.Height} -> Probability: {this.Probability}";
}
}
[DataContract(IsReference = true)]
public class BoundingBox
{
public Brush BoxColor { get; set; }
[DataMember]
public double Top { get; set; }
[DataMember]
public double Left { get; set; }
[DataMember]
public double Height { get; set; }
[DataMember]
public double Width { get; set; }
[DataMember]
public double HeightPercentage
{
get
{
if (MaxHeight > 0)
{
return Height /MaxHeight;
}
else
{
return 0;
}
}
}
[DataMember]
public double WidthPercentage
{
get
{
if (MaxWidth > 0)
{
return Width / MaxWidth;
}
else
{
return 0;
}
}
}
public Tuple<double, double> TopLeft
{
get
{
return new Tuple<double, double>(this.Top, this.Left);
}
}
public Tuple<double, double> BottomLeft
{
get
{
return new Tuple<double, double>(this.Top - Height, this.Left);
}
}
public Tuple<double, double> TopRight
{
get
{
return new Tuple<double, double>(this.Top, this.Left + this.Width);
}
}
public Tuple<double, double> BottomRight
{
get
{
return new Tuple<double, double>(this.Top - Height, this.Left + this.Width);
}
}
[DataMember]
public double TopNorm { get; set; }
[DataMember]
public double LeftNorm { get; set; }
[DataMember]
public double MaxWidth { get; set; }
[DataMember]
public double MaxHeight { get; set; }
[DataMember]
public double MiddleHeight
{
get
{
return Math.Abs(Top - Height) / 2;
}
}
[DataMember]
public double MiddleWidth { get { return Left + Width / 2; } }
public Rectangle Rectangle
{
get
{
int x = (int)Math.Floor(this.Left);
int y = (int)Math.Floor(this.Top);
int width = (int)Math.Floor(this.Width);
int height = (int)Math.Floor(this.Height);
return new Rectangle(x, y, width, height);
}
}
[DataMember]
public PredictedObject PredictedObject { get; set; }
}
}

Просмотреть файл

@ -0,0 +1,30 @@

using Sketch2Code.Core.BoxGeometry;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Sketch2Code.Core.Entities
{
public class PredictionDetail
{
public IList<PredictedObject> PredictedObjects { get; set; }
public byte[] OriginalImage { get; set; }
public byte[] PredictionImage { get; set; }
public IList<GroupBox> GroupBox { get; set; }
public IList<string> AllClasses
{
get
{
var result = new List<string>();
if(this.PredictedObjects!=null && this.PredictedObjects.Any())
{
result = this.PredictedObjects.Select(p => p.ClassName).Distinct().ToList();
}
return result;
}
}
}
}

Просмотреть файл

@ -0,0 +1,23 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Sketch2Code.Core.Helpers
{
public static class Controls
{
public const string Button = "Button";
public const string CheckBox = "CheckBox";
public const string ComboBox = "ComboBox";
public const string Heading = "Heading";
public const string Image = "Image";
public const string Label = "Label";
public const string Link = "Link";
public const string Paragraph = "Paragraph";
public const string RadioButton = "RadioButton";
public const string Table = "Table";
public const string TextBox = "TextBox";
}
}

Просмотреть файл

@ -0,0 +1,253 @@
using Sketch2Code.Core.Entities;
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Drawing.Imaging;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Sketch2Code.Core.Helpers
{
public static class ImageHelper
{
public static byte[] SliceImage(this byte[] image, double x, double y, double width, double height)
{
using (var ms = new MemoryStream(image))
{
return SliceImage(ms, x, y, width, height);
}
}
public static byte[] SliceImage(this Stream image, double x, double y, double width, double height)
{
var _width = (int)Math.Floor(width);
var _height = (int)Math.Floor(height);
var _x = (int)Math.Floor(x);
var _y = (int)Math.Floor(y);
var rectangle = new Rectangle(_x, _y, _width, _height);
using (Bitmap img = Image.FromStream(image) as Bitmap)
{
var slice = img.Clone(rectangle, img.PixelFormat);
using (var ms = new MemoryStream())
{
slice.Save(ms, ImageFormat.Png);
return ms.ToArray();
}
}
}
public static byte[] DrawRectangle(this Stream image, IList<PredictedObject> objects)
{
byte[] buffer = null;
int tabHeight = 60;
int margin = 15;
int fontSize = 25;
using (var img = Bitmap.FromStream(image))
{
using (var graphics = Graphics.FromImage(img))
{
foreach (var p in objects)
{
var _width = (int)Math.Floor(p.BoundingBox.Width);
var _height = (int)Math.Floor(p.BoundingBox.Height);
var _x = (int)Math.Floor(p.BoundingBox.Left);
var _y = (int)Math.Floor(p.BoundingBox.Top);
var rectangle = new Rectangle(_x, _y, _width, _height);
var tab = new Rectangle(_x, _y - tabHeight, _width, tabHeight);
graphics.DrawRectangle(Pens.Red, tab);
graphics.FillRectangle(p.BoundingBox.BoxColor, tab);
using (var font = new Font("Arial", fontSize, FontStyle.Bold, GraphicsUnit.Pixel))
{
var textBox = new Rectangle(tab.Left + margin, tab.Top + margin, tab.Width, tab.Height);
graphics.DrawString($"{p.ClassName}: {(p.Probability * 100).ToString("F")}%", font, Brushes.White, textBox);
}
graphics.DrawRectangle(Pens.Red, rectangle);
}
}
using (var ms = new MemoryStream())
{
img.Save(ms, img.RawFormat);
buffer = ms.ToArray();
}
}
return buffer;
}
public static byte[] DrawRectangle(this byte[] image, IList<PredictedObject> objects)
{
using(var ms = new MemoryStream(image))
{
return DrawRectangle(ms, objects);
}
}
public static byte[] DrawRectangle(this byte[] image, double x, double y, double width, double height)
{
using (var ms = new MemoryStream(image))
{
using (var img = Bitmap.FromStream(ms))
{
using (var graphics = Graphics.FromImage(img))
{
var _width = (int)Math.Floor(width);
var _height = (int)Math.Floor(height);
var _x = (int)Math.Floor(x);
var _y = (int)Math.Floor(y);
var rectangle = new Rectangle(_x, _y, _width, _height);
graphics.DrawRectangle(Pens.Chocolate, rectangle);
}
img.Save(ms, img.RawFormat);
}
return ms.ToArray();
}
}
public static Dictionary<string, Brush> Colors
{
get
{
var dict = new Dictionary<string, Brush>();
dict.Add("Button", Brushes.Firebrick);
dict.Add("CheckBox", Brushes.Goldenrod);
dict.Add("ComboBox", Brushes.MediumVioletRed);
dict.Add("Heading", Brushes.SteelBlue);
dict.Add("Image", Brushes.Purple);
dict.Add("Label", Brushes.LightSeaGreen);
dict.Add("Link", Brushes.DeepPink);
dict.Add("Paragraph", Brushes.DarkOrange);
dict.Add("RadioButton", Brushes.Chocolate);
dict.Add("Table", Brushes.LightSlateGray);
return dict;
}
}
private static Image scaleByPercent(Image imgPhoto, int Percent)
{
float nPercent = ((float)Percent / 100);
int sourceWidth = imgPhoto.Width;
int sourceHeight = imgPhoto.Height;
int sourceX = 0;
int sourceY = 0;
int destX = 0;
int destY = 0;
int destWidth = (int)(sourceWidth * nPercent);
int destHeight = (int)(sourceHeight * nPercent);
Bitmap bmPhoto = new Bitmap(destWidth, destHeight,
PixelFormat.Format24bppRgb);
bmPhoto.SetResolution(imgPhoto.HorizontalResolution,
imgPhoto.VerticalResolution);
Graphics grPhoto = Graphics.FromImage(bmPhoto);
grPhoto.InterpolationMode = InterpolationMode.High;
grPhoto.DrawImage(imgPhoto,
new Rectangle(destX, destY, destWidth, destHeight),
new Rectangle(sourceX, sourceY, sourceWidth, sourceHeight),
GraphicsUnit.Pixel);
grPhoto.Dispose();
return bmPhoto;
}
public static byte[] OptimizeImage(byte[] original, int scale, int quality)
{
MemoryStream outStream = new MemoryStream();
Image img = Image.FromStream(new MemoryStream(original));
scale = calculateScale(img.Width, img.Height);
img = scaleByPercent(img, scale);
EncoderParameters eps = new EncoderParameters(1);
eps.Param[0] = new EncoderParameter(System.Drawing.Imaging.Encoder.Quality, (long)quality);
ImageCodecInfo ici = GetEncoderInfo("image/png");
ExifRotate(img);
img.Save(outStream, ici, eps);
return outStream.GetBuffer();
}
private static int calculateScale(double width, double height)
{
double dimension;
if (width > height)
{
dimension = width;
}
else
{
dimension = height;
}
if (dimension > 1024)
{
return Convert.ToInt32(1 / (dimension / 1024) * 100);
}
return 100;
}
private static ImageCodecInfo GetEncoderInfo(string mimeType)
{
int j;
ImageCodecInfo[] encoders;
encoders = ImageCodecInfo.GetImageEncoders();
for (j = 0; j < encoders.Length; ++j)
{
if (encoders[j].MimeType == mimeType)
return encoders[j];
}
return null;
}
public static void ExifRotate(Image img)
{
const int exifOrientationID = 0x0112; //274
if (!img.PropertyIdList.Contains(exifOrientationID))
return;
var prop = img.GetPropertyItem(exifOrientationID);
int val = BitConverter.ToUInt16(prop.Value, 0);
var rot = RotateFlipType.RotateNoneFlipNone;
if (val == 3 || val == 4)
rot = RotateFlipType.Rotate180FlipNone;
else if (val == 5 || val == 6)
rot = RotateFlipType.Rotate90FlipNone;
else if (val == 7 || val == 8)
rot = RotateFlipType.Rotate270FlipNone;
if (val == 2 || val == 4 || val == 5 || val == 7)
rot |= RotateFlipType.RotateNoneFlipX;
if (rot != RotateFlipType.RotateNoneFlipNone)
img.RotateFlip(rot);
}
}
}

Просмотреть файл

@ -0,0 +1,36 @@
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
// General Information about an assembly is controlled through the following
// set of attributes. Change these attribute values to modify the information
// associated with an assembly.
[assembly: AssemblyTitle("Sketch2Code.Core")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("Sketch2Code.Core")]
[assembly: AssemblyCopyright("Copyright © 2018")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]
// Setting ComVisible to false makes the types in this assembly not visible
// to COM components. If you need to access a type in this assembly from
// COM, set the ComVisible attribute to true on that type.
[assembly: ComVisible(false)]
// The following GUID is for the ID of the typelib if this project is exposed to COM
[assembly: Guid("6b3b42ca-0998-4f34-b5ca-965f3462f411")]
// Version information for an assembly consists of the following four values:
//
// Major Version
// Minor Version
// Build Number
// Revision
//
// You can specify all the values or you can default the Build and Revision Numbers
// by using the '*' as shown below:
// [assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyVersion("1.0.0.0")]
[assembly: AssemblyFileVersion("1.0.0.0")]

Просмотреть файл

@ -0,0 +1,19 @@
using Sketch2Code.Core.BoxGeometry;
using Sketch2Code.Core.Entities;
using Microsoft.WindowsAzure.Storage.Blob;
using System.Collections.Generic;
using System.Threading.Tasks;
namespace Sketch2Code.Core.Services.Interfaces
{
public interface IObjectDetectionAppService
{
Task<IList<PredictedObject>> GetPredictionAsync(byte[] image);
Task<PredictionDetail> GetPredictionAsync(string folderId);
Task SaveResults(byte[] file, string container, string fileName);
Task SaveResults(IList<PredictedObject> predictedObjects, string id);
Task<IList<CloudBlobContainer>> GetPredictionsAsync();
Task<byte[]> GetFile(string container, string file);
Task<GroupBox> CreateGroupBoxAsync(IList<PredictedObject> predictedObjects);
}
}

Просмотреть файл

@ -0,0 +1,299 @@
using Sketch2Code.AI;
using Sketch2Code.Core.Entities;
using Sketch2Code.Core.Services.Interfaces;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Sketch2Code.Core.Helpers;
using System.IO;
using System.Drawing;
using System.Configuration;
using Microsoft.WindowsAzure.Storage.Blob;
using Microsoft.WindowsAzure.Storage;
using Newtonsoft.Json;
using Sketch2Code.Core.BoxGeometry;
using Microsoft.Extensions.Logging;
using Microsoft.ApplicationInsights;
using Microsoft.Azure.CognitiveServices.Vision.CustomVision.Prediction.Models;
using System.Diagnostics;
using Microsoft.ProjectOxford.Vision.Contract;
namespace Sketch2Code.Core
{
public class ObjectDetectionAppService : IObjectDetectionAppService
{
ObjectDetector _detectorClient;
CloudBlobClient _cloudBlobClient;
int predicted_index = 0;
public ObjectDetectionAppService(ObjectDetector detectorClient, ILogger logger)
{
_detectorClient = detectorClient;
_detectorClient.Initialize();
var account = CloudStorageAccount.Parse(ConfigurationManager.AppSettings["AzureWebJobsStorage"]);
_cloudBlobClient = account.CreateCloudBlobClient();
}
public ObjectDetectionAppService() : this(new ObjectDetector(),
new LoggerFactory().CreateLogger<ObjectDetectionAppService>())
{
}
public ObjectDetectionAppService(ILogger logger) : this(new ObjectDetector(), logger)
{
}
public async Task<IList<PredictedObject>> GetPredictionAsync(byte[] data)
{
throw new NotImplementedException();
}
private static void removePredictionsUnderProbabilityThreshold(List<PredictionModel> predictions)
{
var Probability = Convert.ToInt32(ConfigurationManager.AppSettings["Probability"]);
predictions.RemoveAll(p => p.Probability < (Probability / 100D));
}
private async Task assignPredictedText(PredictedObject predictedObject)
{
//Exclude images from non predictable classes
var nonPredictableClasses = new string[] { Controls.Image, Controls.Paragraph, Controls.TextBox };
bool okHeight = predictedObject.BoundingBox.Height <= 3200 && predictedObject.BoundingBox.Height >= 40;
bool okWidth = predictedObject.BoundingBox.Width <= 3200 && predictedObject.BoundingBox.Width >= 40;
bool predictable = !nonPredictableClasses.Contains(predictedObject.ClassName);
if (okHeight && okWidth && predictable)
{
var result = await this._detectorClient.GetText(predictedObject.SlicedImage);
predictedObject.Text = result;
await Task.Delay(Convert.ToInt32(ConfigurationManager.AppSettings["ComputerVisionDelay"]));
}
}
private void assignPredictedText2(PredictedObject predictedObject, HandwritingTextLine[] textLines)
{
predictedObject.Text = new List<string>();
for (int i = 0; i < textLines.Length; i++)
{
//if areas are 100% overlapping assign every textline
Overlap ovl = new Overlap();
Entities.BoundingBox b = new Entities.BoundingBox();
int min_x = textLines[i].Polygon.Points.Min(p => p.X);
int min_y = textLines[i].Polygon.Points.Min(p => p.Y);
int max_x = textLines[i].Polygon.Points.Max(p => p.X);
int max_y = textLines[i].Polygon.Points.Max(p => p.Y);
b.Left = min_x;
b.Top = min_y;
b.Width = max_x - min_x;
b.Height = max_y - min_y;
//If boxes overlaps more than 50% we decide they are the same thing
if (ovl.OverlapArea(predictedObject.BoundingBox, b) > 0.5)
{
for(int j = 0; j < textLines[i].Words.Length; j++)
{
predictedObject.Text.Add(textLines[i].Words[j].Text);
}
}
}
}
private void removeUnusableImages(List<PredictedObject> list)
{
//Remove images with size over 4mb
list.RemoveAll(img => img.SlicedImage.Length >= 4 * 1024 * 1024);
//Exclude images outside of this range 40x40 - 3200x3200
list.RemoveAll(p => p.BoundingBox.Height > 3200 || p.BoundingBox.Height < 40);
list.RemoveAll(p => p.BoundingBox.Width > 3200 || p.BoundingBox.Width < 40);
}
private PredictedObject buildPredictedObject(PredictionModel p, Image image, byte[] data)
{
PredictedObject predictedObject = new PredictedObject();
predictedObject.BoundingBox.Top = p.BoundingBox.Top * image.Height;
predictedObject.BoundingBox.Height = p.BoundingBox.Height * image.Height;
predictedObject.BoundingBox.Left = p.BoundingBox.Left * image.Width;
predictedObject.BoundingBox.Width = p.BoundingBox.Width * image.Width;
predictedObject.BoundingBox.TopNorm = p.BoundingBox.Top;
predictedObject.BoundingBox.LeftNorm = p.BoundingBox.Left;
predictedObject.BoundingBox.MaxHeight = image.Height;
predictedObject.BoundingBox.MaxWidth = image.Width;
predictedObject.ClassName = p.TagName;
predictedObject.Probability = p.Probability;
predictedObject.SlicedImage = data.SliceImage(predictedObject.BoundingBox.Left,
predictedObject.BoundingBox.Top, predictedObject.BoundingBox.Width, predictedObject.BoundingBox.Height);
predictedObject.Name = ($"slice_{predictedObject.ClassName}_{predicted_index}");
predictedObject.FileName = ($"slices/{predictedObject.Name}.png");
predicted_index++;
return predictedObject;
}
private Image buildAndVerifyImage(byte[] data)
{
double imageWidth = 0;
double imageHeight = 0;
Image img;
using (var ms = new MemoryStream(data))
{
img = Image.FromStream(ms);
imageWidth = img.Width;
imageHeight = img.Height;
if ((imageWidth == 0) || (imageHeight == 0))
{
throw new InvalidOperationException("Invalid image dimensions");
}
}
return img;
}
public async Task SaveResults(IList<PredictedObject> predictedObjects, string id)
{
if (_cloudBlobClient == null) throw new InvalidOperationException("blobClient is null");
var slices_container = $"{id}/slices";
for (int i = 0; i < predictedObjects.Count; i++)
{
PredictedObject result = (PredictedObject)predictedObjects[i];
await this.SaveResults(result.SlicedImage, slices_container, $"{result.Name}.png");
}
}
public async Task SaveResults(byte[] file, string container, string fileName)
{
CloudBlobContainer theContainer = null;
if (_cloudBlobClient == null) throw new InvalidOperationException("blobClient is null");
var segments = container.Split(@"/".ToCharArray(), StringSplitOptions.RemoveEmptyEntries);
var rootContainerPath = segments.First();
var relativePath = String.Join(@"/", segments.Except(new string[] { rootContainerPath }));
theContainer = _cloudBlobClient.GetContainerReference($"{rootContainerPath}");
await theContainer.CreateIfNotExistsAsync();
var permission = new BlobContainerPermissions();
permission.PublicAccess = BlobContainerPublicAccessType.Blob;
await theContainer.SetPermissionsAsync(permission);
if (relativePath != rootContainerPath)
{
fileName = Path.Combine(relativePath, fileName);
}
var blob = theContainer.GetBlockBlobReference(fileName);
await blob.UploadFromByteArrayAsync(file, 0, file.Length);
}
public async Task SaveHtmlResults(string html, string container, string fileName)
{
CloudBlobContainer theContainer = null;
if (_cloudBlobClient == null) throw new InvalidOperationException("blobClient is null");
var segments = container.Split(@"/".ToCharArray(), StringSplitOptions.RemoveEmptyEntries);
var rootContainerPath = segments.First();
var relativePath = String.Join(@"/", segments.Except(new string[] { rootContainerPath }));
theContainer = _cloudBlobClient.GetContainerReference($"{rootContainerPath}");
await theContainer.CreateIfNotExistsAsync();
var permission = new BlobContainerPermissions();
permission.PublicAccess = BlobContainerPublicAccessType.Blob;
await theContainer.SetPermissionsAsync(permission);
if (relativePath != rootContainerPath)
{
fileName = Path.Combine(relativePath, fileName);
}
var blob = theContainer.GetBlockBlobReference(fileName);
await blob.UploadTextAsync(html);
}
public async Task<PredictionDetail> GetPredictionAsync(string folderId)
{
if (String.IsNullOrWhiteSpace(folderId))
throw new ArgumentNullException("folderId");
var blobContainer = _cloudBlobClient.GetContainerReference(folderId);
bool exists = await blobContainer.ExistsAsync();
if (!exists)
throw new DirectoryNotFoundException($"Container {folderId} does not exist");
var groupsBlob = blobContainer.GetBlockBlobReference("groups.json");
var detail = new PredictionDetail();
detail.OriginalImage = await this.GetFile(folderId, "original.png");
detail.PredictionImage = await this.GetFile(folderId, "predicted.png");
detail.PredictedObjects = await this.GetFile<IList<PredictedObject>>(folderId, "results.json");
var groupBox = await this.GetFile<GroupBox>(folderId, "groups.json");
detail.GroupBox = new List<GroupBox> { groupBox };
return detail;
}
public async Task<IList<CloudBlobContainer>> GetPredictionsAsync()
{
return await Task.Run(() => _cloudBlobClient.ListContainers().Where(l => l.Name != "azure-webjobs-hosts")
.OrderByDescending(c => c.Properties.LastModified).ToList());
}
public async Task<byte[]> GetFile(string container, string file)
{
var blobcontainer = _cloudBlobClient.GetContainerReference(container);
if (!await blobcontainer.ExistsAsync())
{
throw new ApplicationException($"container {container} does not exist");
}
var blob = blobcontainer.GetBlobReference(file);
if (!await blob.ExistsAsync())
{
throw new ApplicationException($"file {file} does not exist in container {container}");
}
using (var ms = new MemoryStream())
{
await blob.DownloadToStreamAsync(ms);
return ms.ToArray();
}
}
public async Task<T> GetFile<T>(string container, string file)
{
var data = await this.GetFile(container, file);
if (data == null) return default(T);
return JsonConvert.DeserializeObject<T>(Encoding.UTF8.GetString(data));
}
public async Task<GroupBox> CreateGroupBoxAsync(IList<PredictedObject> predictedObjects)
{
var result = await Task.Run(() =>
{
//Project each prediction into its bounding box
foreach (var p in predictedObjects)
p.BoundingBox.PredictedObject = p;
var list = predictedObjects.Select(p => p.BoundingBox).ToList();
//Execute BoxGeometry methods
BoxGeometry.Geometry g = new BoxGeometry.Geometry();
g.RemoveOverlapping(list);
BoxGeometry.GroupBox root = g.BuildGroups(list);
return root;
});
return result;
}
}
}

Просмотреть файл

@ -0,0 +1,176 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
<PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
<ProjectGuid>{EF52A79D-67DB-4B60-BC0F-300135FE8CDA}</ProjectGuid>
<OutputType>Library</OutputType>
<AppDesignerFolder>Properties</AppDesignerFolder>
<RootNamespace>Sketch2Code.Core</RootNamespace>
<AssemblyName>Sketch2Code.Core</AssemblyName>
<TargetFrameworkVersion>v4.6.1</TargetFrameworkVersion>
<FileAlignment>512</FileAlignment>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<DebugSymbols>true</DebugSymbols>
<DebugType>full</DebugType>
<Optimize>false</Optimize>
<OutputPath>bin\Debug\</OutputPath>
<DefineConstants>DEBUG;TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
<DebugType>pdbonly</DebugType>
<Optimize>true</Optimize>
<OutputPath>bin\Release\</OutputPath>
<DefineConstants>TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<ItemGroup>
<Reference Include="Microsoft.AI.Agent.Intercept, Version=2.4.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
<HintPath>..\packages\Microsoft.ApplicationInsights.Agent.Intercept.2.4.0\lib\net45\Microsoft.AI.Agent.Intercept.dll</HintPath>
</Reference>
<Reference Include="Microsoft.AI.DependencyCollector, Version=2.4.1.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
<HintPath>..\packages\Microsoft.ApplicationInsights.DependencyCollector.2.4.1\lib\net45\Microsoft.AI.DependencyCollector.dll</HintPath>
</Reference>
<Reference Include="Microsoft.AI.PerfCounterCollector, Version=2.4.1.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
<HintPath>..\packages\Microsoft.ApplicationInsights.PerfCounterCollector.2.4.1\lib\net45\Microsoft.AI.PerfCounterCollector.dll</HintPath>
</Reference>
<Reference Include="Microsoft.AI.ServerTelemetryChannel, Version=2.4.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
<HintPath>..\packages\Microsoft.ApplicationInsights.WindowsServer.TelemetryChannel.2.4.0\lib\net45\Microsoft.AI.ServerTelemetryChannel.dll</HintPath>
</Reference>
<Reference Include="Microsoft.AI.WindowsServer, Version=2.4.1.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
<HintPath>..\packages\Microsoft.ApplicationInsights.WindowsServer.2.4.1\lib\net45\Microsoft.AI.WindowsServer.dll</HintPath>
</Reference>
<Reference Include="Microsoft.ApplicationInsights, Version=2.4.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
<HintPath>..\packages\Microsoft.ApplicationInsights.2.4.0\lib\net46\Microsoft.ApplicationInsights.dll</HintPath>
</Reference>
<Reference Include="Microsoft.Azure.CognitiveServices.Vision.CustomVision.Prediction, Version=0.10.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
<HintPath>..\packages\Microsoft.Azure.CognitiveServices.Vision.CustomVision.Prediction.0.10.0-preview\lib\net452\Microsoft.Azure.CognitiveServices.Vision.CustomVision.Prediction.dll</HintPath>
</Reference>
<Reference Include="Microsoft.Azure.KeyVault.Core, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
<HintPath>..\packages\Microsoft.Azure.KeyVault.Core.1.0.0\lib\net40\Microsoft.Azure.KeyVault.Core.dll</HintPath>
</Reference>
<Reference Include="Microsoft.Azure.WebJobs, Version=2.2.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
<HintPath>..\packages\Microsoft.Azure.WebJobs.Core.2.2.0\lib\net45\Microsoft.Azure.WebJobs.dll</HintPath>
</Reference>
<Reference Include="Microsoft.Azure.WebJobs.Host, Version=2.2.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
<HintPath>..\packages\Microsoft.Azure.WebJobs.2.2.0\lib\net45\Microsoft.Azure.WebJobs.Host.dll</HintPath>
</Reference>
<Reference Include="Microsoft.Azure.WebJobs.Logging.ApplicationInsights, Version=2.2.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
<HintPath>..\packages\Microsoft.Azure.WebJobs.Logging.ApplicationInsights.2.2.0\lib\net45\Microsoft.Azure.WebJobs.Logging.ApplicationInsights.dll</HintPath>
</Reference>
<Reference Include="Microsoft.Data.Edm, Version=5.8.1.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
<HintPath>..\packages\Microsoft.Data.Edm.5.8.2\lib\net40\Microsoft.Data.Edm.dll</HintPath>
</Reference>
<Reference Include="Microsoft.Data.OData, Version=5.8.1.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
<HintPath>..\packages\Microsoft.Data.OData.5.8.2\lib\net40\Microsoft.Data.OData.dll</HintPath>
</Reference>
<Reference Include="Microsoft.Data.Services.Client, Version=5.8.1.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
<HintPath>..\packages\Microsoft.Data.Services.Client.5.8.2\lib\net40\Microsoft.Data.Services.Client.dll</HintPath>
</Reference>
<Reference Include="Microsoft.Extensions.Configuration, Version=2.1.1.0, Culture=neutral, PublicKeyToken=adb9793829ddae60, processorArchitecture=MSIL">
<HintPath>..\packages\Microsoft.Extensions.Configuration.2.1.1\lib\netstandard2.0\Microsoft.Extensions.Configuration.dll</HintPath>
</Reference>
<Reference Include="Microsoft.Extensions.Configuration.Abstractions, Version=2.1.1.0, Culture=neutral, PublicKeyToken=adb9793829ddae60, processorArchitecture=MSIL">
<HintPath>..\packages\Microsoft.Extensions.Configuration.Abstractions.2.1.1\lib\netstandard2.0\Microsoft.Extensions.Configuration.Abstractions.dll</HintPath>
</Reference>
<Reference Include="Microsoft.Extensions.Configuration.Binder, Version=2.1.1.0, Culture=neutral, PublicKeyToken=adb9793829ddae60, processorArchitecture=MSIL">
<HintPath>..\packages\Microsoft.Extensions.Configuration.Binder.2.1.1\lib\netstandard2.0\Microsoft.Extensions.Configuration.Binder.dll</HintPath>
</Reference>
<Reference Include="Microsoft.Extensions.DependencyInjection.Abstractions, Version=2.1.1.0, Culture=neutral, PublicKeyToken=adb9793829ddae60, processorArchitecture=MSIL">
<HintPath>..\packages\Microsoft.Extensions.DependencyInjection.Abstractions.2.1.1\lib\netstandard2.0\Microsoft.Extensions.DependencyInjection.Abstractions.dll</HintPath>
</Reference>
<Reference Include="Microsoft.Extensions.Logging, Version=2.1.1.0, Culture=neutral, PublicKeyToken=adb9793829ddae60, processorArchitecture=MSIL">
<HintPath>..\packages\Microsoft.Extensions.Logging.2.1.1\lib\netstandard2.0\Microsoft.Extensions.Logging.dll</HintPath>
</Reference>
<Reference Include="Microsoft.Extensions.Logging.Abstractions, Version=2.1.1.0, Culture=neutral, PublicKeyToken=adb9793829ddae60, processorArchitecture=MSIL">
<HintPath>..\packages\Microsoft.Extensions.Logging.Abstractions.2.1.1\lib\netstandard2.0\Microsoft.Extensions.Logging.Abstractions.dll</HintPath>
</Reference>
<Reference Include="Microsoft.Extensions.Options, Version=2.1.1.0, Culture=neutral, PublicKeyToken=adb9793829ddae60, processorArchitecture=MSIL">
<HintPath>..\packages\Microsoft.Extensions.Options.2.1.1\lib\netstandard2.0\Microsoft.Extensions.Options.dll</HintPath>
</Reference>
<Reference Include="Microsoft.Extensions.Primitives, Version=2.1.1.0, Culture=neutral, PublicKeyToken=adb9793829ddae60, processorArchitecture=MSIL">
<HintPath>..\packages\Microsoft.Extensions.Primitives.2.1.1\lib\netstandard2.0\Microsoft.Extensions.Primitives.dll</HintPath>
</Reference>
<Reference Include="Microsoft.ProjectOxford.Vision, Version=1.0.393.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
<HintPath>..\packages\Microsoft.ProjectOxford.Vision.1.0.393\lib\portable-net45+win+wpa81+wp80+MonoAndroid10+xamarinios10+MonoTouch10\Microsoft.ProjectOxford.Vision.dll</HintPath>
</Reference>
<Reference Include="Microsoft.Rest.ClientRuntime, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
<HintPath>..\packages\Microsoft.Rest.ClientRuntime.2.3.11\lib\net452\Microsoft.Rest.ClientRuntime.dll</HintPath>
</Reference>
<Reference Include="Microsoft.Rest.ClientRuntime.Azure, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
<HintPath>..\packages\Microsoft.Rest.ClientRuntime.Azure.3.3.12\lib\net452\Microsoft.Rest.ClientRuntime.Azure.dll</HintPath>
</Reference>
<Reference Include="Microsoft.WindowsAzure.Storage, Version=8.7.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
<HintPath>..\packages\WindowsAzure.Storage.8.7.0\lib\net45\Microsoft.WindowsAzure.Storage.dll</HintPath>
</Reference>
<Reference Include="Newtonsoft.Json, Version=9.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL">
<HintPath>..\packages\Newtonsoft.Json.9.0.1\lib\net45\Newtonsoft.Json.dll</HintPath>
</Reference>
<Reference Include="System" />
<Reference Include="System.Buffers, Version=4.0.2.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
<HintPath>..\packages\System.Buffers.4.4.0\lib\netstandard2.0\System.Buffers.dll</HintPath>
</Reference>
<Reference Include="System.Configuration" />
<Reference Include="System.Core" />
<Reference Include="System.Diagnostics.DiagnosticSource, Version=4.0.2.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
<HintPath>..\packages\System.Diagnostics.DiagnosticSource.4.4.0\lib\net46\System.Diagnostics.DiagnosticSource.dll</HintPath>
</Reference>
<Reference Include="System.Drawing" />
<Reference Include="System.Memory, Version=4.0.1.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
<HintPath>..\packages\System.Memory.4.5.1\lib\netstandard2.0\System.Memory.dll</HintPath>
</Reference>
<Reference Include="System.Numerics" />
<Reference Include="System.Numerics.Vectors, Version=4.1.3.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
<HintPath>..\packages\System.Numerics.Vectors.4.4.0\lib\net46\System.Numerics.Vectors.dll</HintPath>
</Reference>
<Reference Include="System.Runtime.CompilerServices.Unsafe, Version=4.0.4.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
<HintPath>..\packages\System.Runtime.CompilerServices.Unsafe.4.5.1\lib\netstandard2.0\System.Runtime.CompilerServices.Unsafe.dll</HintPath>
</Reference>
<Reference Include="System.Runtime.Serialization" />
<Reference Include="System.Spatial, Version=5.8.1.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
<HintPath>..\packages\System.Spatial.5.8.2\lib\net40\System.Spatial.dll</HintPath>
</Reference>
<Reference Include="System.Xml.Linq" />
<Reference Include="System.Data.DataSetExtensions" />
<Reference Include="Microsoft.CSharp" />
<Reference Include="System.Data" />
<Reference Include="System.Net.Http" />
<Reference Include="System.Xml" />
</ItemGroup>
<ItemGroup>
<Compile Include="Entities\BoxGeometry\Geometry.cs" />
<Compile Include="Entities\BoxGeometry\GroupBox.cs" />
<Compile Include="Entities\BoxGeometry\Overlap.cs" />
<Compile Include="Entities\BoxGeometry\ProjectionRuler.cs" />
<Compile Include="Entities\BoxGeometry\Section.cs" />
<Compile Include="Entities\BoxGeometry\SliceSection.cs" />
<Compile Include="Entities\PredictedObject.cs" />
<Compile Include="Entities\PredictionDetail.cs" />
<Compile Include="Helpers\Controls.cs" />
<Compile Include="Helpers\ImageHelper.cs" />
<Compile Include="Services\Interfaces\IObjectDetectionAppService.cs" />
<Compile Include="Services\ObjectDetectionAppService.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
</ItemGroup>
<ItemGroup>
<None Include="app.config">
<SubType>Designer</SubType>
</None>
<None Include="ApplicationInsights.config">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Include="packages.config" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\Sketch2Code.AI\Sketch2Code.AI.csproj">
<Project>{47bce6ca-9347-4fb6-900b-770426958083}</Project>
<Name>Sketch2Code.AI</Name>
</ProjectReference>
</ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
</Project>

Просмотреть файл

@ -0,0 +1,23 @@
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="System.Net.Http" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.1.1.2" newVersion="4.1.1.2" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="Newtonsoft.Json" publicKeyToken="30ad4fe6b2a6aeed" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-9.0.0.0" newVersion="9.0.0.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="Microsoft.WindowsAzure.Storage" publicKeyToken="31bf3856ad364e35" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-8.7.0.0" newVersion="8.7.0.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="Microsoft.Extensions.Logging.Abstractions" publicKeyToken="adb9793829ddae60" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-2.1.1.0" newVersion="2.1.1.0" />
</dependentAssembly>
</assemblyBinding>
</runtime>
</configuration>

Просмотреть файл

@ -0,0 +1,41 @@
<?xml version="1.0" encoding="utf-8"?>
<packages>
<package id="Microsoft.ApplicationInsights" version="2.4.0" targetFramework="net461" />
<package id="Microsoft.ApplicationInsights.Agent.Intercept" version="2.4.0" targetFramework="net461" />
<package id="Microsoft.ApplicationInsights.DependencyCollector" version="2.4.1" targetFramework="net461" />
<package id="Microsoft.ApplicationInsights.PerfCounterCollector" version="2.4.1" targetFramework="net461" />
<package id="Microsoft.ApplicationInsights.WindowsServer" version="2.4.1" targetFramework="net461" />
<package id="Microsoft.ApplicationInsights.WindowsServer.TelemetryChannel" version="2.4.0" targetFramework="net461" />
<package id="Microsoft.Azure.CognitiveServices.Vision.CustomVision.Prediction" version="0.10.0-preview" targetFramework="net461" />
<package id="Microsoft.Azure.CognitiveServices.Vision.CustomVision.Training" version="0.10.0-preview" targetFramework="net461" />
<package id="Microsoft.Azure.KeyVault.Core" version="1.0.0" targetFramework="net461" />
<package id="Microsoft.Azure.WebJobs" version="2.2.0" targetFramework="net461" />
<package id="Microsoft.Azure.WebJobs.Core" version="2.2.0" targetFramework="net461" />
<package id="Microsoft.Azure.WebJobs.Logging.ApplicationInsights" version="2.2.0" targetFramework="net461" />
<package id="Microsoft.Data.Edm" version="5.8.4" targetFramework="net461" />
<package id="Microsoft.Data.OData" version="5.8.4" targetFramework="net461" />
<package id="Microsoft.Data.Services.Client" version="5.8.4" targetFramework="net461" />
<package id="Microsoft.Extensions.Configuration" version="2.1.1" targetFramework="net461" />
<package id="Microsoft.Extensions.Configuration.Abstractions" version="2.1.1" targetFramework="net461" />
<package id="Microsoft.Extensions.Configuration.Binder" version="2.1.1" targetFramework="net461" />
<package id="Microsoft.Extensions.DependencyInjection.Abstractions" version="2.1.1" targetFramework="net461" />
<package id="Microsoft.Extensions.Logging" version="2.1.1" targetFramework="net461" />
<package id="Microsoft.Extensions.Logging.Abstractions" version="2.1.1" targetFramework="net461" />
<package id="Microsoft.Extensions.Options" version="2.1.1" targetFramework="net461" />
<package id="Microsoft.Extensions.Primitives" version="2.1.1" targetFramework="net461" />
<package id="Microsoft.ProjectOxford.Vision" version="1.0.393" targetFramework="net461" />
<package id="Microsoft.Rest.ClientRuntime" version="2.3.11" targetFramework="net461" />
<package id="Microsoft.Rest.ClientRuntime.Azure" version="3.3.12" targetFramework="net461" />
<package id="Newtonsoft.Json" version="9.0.1" targetFramework="net461" />
<package id="System.Buffers" version="4.4.0" targetFramework="net461" />
<package id="System.ComponentModel.EventBasedAsync" version="4.0.11" targetFramework="net461" />
<package id="System.Diagnostics.DiagnosticSource" version="4.4.0" targetFramework="net461" />
<package id="System.Dynamic.Runtime" version="4.0.0" targetFramework="net461" />
<package id="System.Linq.Queryable" version="4.0.0" targetFramework="net461" />
<package id="System.Memory" version="4.5.1" targetFramework="net461" />
<package id="System.Net.Requests" version="4.0.11" targetFramework="net461" />
<package id="System.Numerics.Vectors" version="4.4.0" targetFramework="net461" />
<package id="System.Runtime.CompilerServices.Unsafe" version="4.5.1" targetFramework="net461" />
<package id="System.Spatial" version="5.8.2" targetFramework="net461" />
<package id="WindowsAzure.Storage" version="8.7.0" targetFramework="net461" />
</packages>

Двоичный файл не отображается.

Двоичный файл не отображается.

Двоичный файл не отображается.

Двоичный файл не отображается.

Двоичный файл не отображается.

Двоичный файл не отображается.

Двоичный файл не отображается.

Двоичный файл не отображается.

Двоичный файл не отображается.

Двоичный файл не отображается.

Двоичный файл не отображается.

Двоичный файл не отображается.

Двоичный файл не отображается.

Двоичный файл не отображается.

Двоичный файл не отображается.

Двоичные данные
sketch2code/Sketch2Code.Web/App_Data/wkhtmltoimage/concrt140.dll Normal file

Двоичный файл не отображается.

Двоичные данные
sketch2code/Sketch2Code.Web/App_Data/wkhtmltoimage/msvcp140.dll Normal file

Двоичный файл не отображается.

Двоичные данные
sketch2code/Sketch2Code.Web/App_Data/wkhtmltoimage/ucrtbase.dll Normal file

Двоичный файл не отображается.

Двоичный файл не отображается.

Двоичный файл не отображается.

Просмотреть файл

@ -0,0 +1,14 @@
using System.Web;
using System.Web.Mvc;
namespace Sketch2Code.Web{
public class FilterConfig
{
public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
filters.Add(new ErrorHandler.AiHandleErrorAttribute());
if(!HttpContext.Current.IsDebuggingEnabled)
filters.Add(new RequireHttpsAttribute(true));
}
}
}

Просмотреть файл

@ -0,0 +1,66 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Web.Routing;
namespace Sketch2Code.Web
{
public class RouteConfig
{
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapMvcAttributeRoutes();
routes.MapRoute(
name: "Detail",
url: "details/{id}",
defaults: new { controller = "app", action="details" ,id = UrlParameter.Optional }
);
routes.MapRoute(
name: "ready-to-start",
url: "ready-to-start",
defaults: new { controller = "app", action = "Step2", id = UrlParameter.Optional }
);
routes.MapRoute(
name: "upload",
url: "upload",
defaults: new { controller = "app", action = "Upload", id = UrlParameter.Optional }
);
routes.MapRoute(
name: "work-in-progress",
url: "work-in-progress",
defaults: new { controller = "app", action = "Step3", id = UrlParameter.Optional }
);
routes.MapRoute(
name: "finished",
url: "finished/{id}",
defaults: new { controller = "app", action = "Step4", id = UrlParameter.Optional }
);
routes.MapRoute(
name: "generated-html",
url: "generated-html/{id}",
defaults: new { controller = "app", action = "Step5", id = UrlParameter.Optional }
);
routes.MapRoute(
name: "camera",
url: "take-snapshot",
defaults: new { controller = "app", action = "TakeSnapshot", id = UrlParameter.Optional }
);
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "app", action = "Index", id = UrlParameter.Optional }
);
}
}
}

Просмотреть файл

@ -0,0 +1,106 @@
<?xml version="1.0" encoding="utf-8"?>
<ApplicationInsights xmlns="http://schemas.microsoft.com/ApplicationInsights/2013/Settings">
<TelemetryInitializers>
<Add Type="Microsoft.ApplicationInsights.DependencyCollector.HttpDependenciesParsingTelemetryInitializer, Microsoft.AI.DependencyCollector" />
<Add Type="Microsoft.ApplicationInsights.WindowsServer.AzureRoleEnvironmentTelemetryInitializer, Microsoft.AI.WindowsServer" />
<Add Type="Microsoft.ApplicationInsights.WindowsServer.AzureWebAppRoleEnvironmentTelemetryInitializer, Microsoft.AI.WindowsServer" />
<Add Type="Microsoft.ApplicationInsights.WindowsServer.BuildInfoConfigComponentVersionTelemetryInitializer, Microsoft.AI.WindowsServer" />
<Add Type="Microsoft.ApplicationInsights.Web.WebTestTelemetryInitializer, Microsoft.AI.Web" />
<Add Type="Microsoft.ApplicationInsights.Web.SyntheticUserAgentTelemetryInitializer, Microsoft.AI.Web">
<!-- Extended list of bots:
search|spider|crawl|Bot|Monitor|BrowserMob|BingPreview|PagePeeker|WebThumb|URL2PNG|ZooShot|GomezA|Google SketchUp|Read Later|KTXN|KHTE|Keynote|Pingdom|AlwaysOn|zao|borg|oegp|silk|Xenu|zeal|NING|htdig|lycos|slurp|teoma|voila|yahoo|Sogou|CiBra|Nutch|Java|JNLP|Daumoa|Genieo|ichiro|larbin|pompos|Scrapy|snappy|speedy|vortex|favicon|indexer|Riddler|scooter|scraper|scrubby|WhatWeb|WinHTTP|voyager|archiver|Icarus6j|mogimogi|Netvibes|altavista|charlotte|findlinks|Retreiver|TLSProber|WordPress|wsr-agent|http client|Python-urllib|AppEngine-Google|semanticdiscovery|facebookexternalhit|web/snippet|Google-HTTP-Java-Client-->
<Filters>search|spider|crawl|Bot|Monitor|AlwaysOn</Filters>
</Add>
<Add Type="Microsoft.ApplicationInsights.Web.ClientIpHeaderTelemetryInitializer, Microsoft.AI.Web" />
<Add Type="Microsoft.ApplicationInsights.Web.OperationNameTelemetryInitializer, Microsoft.AI.Web" />
<Add Type="Microsoft.ApplicationInsights.Web.OperationCorrelationTelemetryInitializer, Microsoft.AI.Web" />
<Add Type="Microsoft.ApplicationInsights.Web.UserTelemetryInitializer, Microsoft.AI.Web" />
<Add Type="Microsoft.ApplicationInsights.Web.AuthenticatedUserIdTelemetryInitializer, Microsoft.AI.Web" />
<Add Type="Microsoft.ApplicationInsights.Web.AccountIdTelemetryInitializer, Microsoft.AI.Web" />
<Add Type="Microsoft.ApplicationInsights.Web.SessionTelemetryInitializer, Microsoft.AI.Web" />
</TelemetryInitializers>
<TelemetryModules>
<Add Type="Microsoft.ApplicationInsights.DependencyCollector.DependencyTrackingTelemetryModule, Microsoft.AI.DependencyCollector">
<ExcludeComponentCorrelationHttpHeadersOnDomains>
<!--
Requests to the following hostnames will not be modified by adding correlation headers.
This is only applicable if Profiler is installed via either StatusMonitor or Azure Extension.
Add entries here to exclude additional hostnames.
NOTE: this configuration will be lost upon NuGet upgrade.
-->
<Add>core.windows.net</Add>
<Add>core.chinacloudapi.cn</Add>
<Add>core.cloudapi.de</Add>
<Add>core.usgovcloudapi.net</Add>
<Add>localhost</Add>
<Add>127.0.0.1</Add>
</ExcludeComponentCorrelationHttpHeadersOnDomains>
</Add>
<Add Type="Microsoft.ApplicationInsights.Extensibility.PerfCounterCollector.PerformanceCollectorModule, Microsoft.AI.PerfCounterCollector">
<!--
Use the following syntax here to collect additional performance counters:
<Counters>
<Add PerformanceCounter="\Process(??APP_WIN32_PROC??)\Handle Count" ReportAs="Process handle count" />
...
</Counters>
PerformanceCounter must be either \CategoryName(InstanceName)\CounterName or \CategoryName\CounterName
NOTE: performance counters configuration will be lost upon NuGet upgrade.
The following placeholders are supported as InstanceName:
??APP_WIN32_PROC?? - instance name of the application process for Win32 counters.
??APP_W3SVC_PROC?? - instance name of the application IIS worker process for IIS/ASP.NET counters.
??APP_CLR_PROC?? - instance name of the application CLR process for .NET counters.
-->
</Add>
<Add Type="Microsoft.ApplicationInsights.Extensibility.PerfCounterCollector.QuickPulse.QuickPulseTelemetryModule, Microsoft.AI.PerfCounterCollector" />
<Add Type="Microsoft.ApplicationInsights.WindowsServer.DeveloperModeWithDebuggerAttachedTelemetryModule, Microsoft.AI.WindowsServer" />
<Add Type="Microsoft.ApplicationInsights.WindowsServer.UnhandledExceptionTelemetryModule, Microsoft.AI.WindowsServer" />
<Add Type="Microsoft.ApplicationInsights.WindowsServer.UnobservedExceptionTelemetryModule, Microsoft.AI.WindowsServer">
<!--</Add>
<Add Type="Microsoft.ApplicationInsights.WindowsServer.FirstChanceExceptionStatisticsTelemetryModule, Microsoft.AI.WindowsServer">-->
</Add>
<Add Type="Microsoft.ApplicationInsights.Web.RequestTrackingTelemetryModule, Microsoft.AI.Web">
<Handlers>
<!--
Add entries here to filter out additional handlers:
NOTE: handler configuration will be lost upon NuGet upgrade.
-->
<Add>System.Web.Handlers.TransferRequestHandler</Add>
<Add>Microsoft.VisualStudio.Web.PageInspector.Runtime.Tracing.RequestDataHttpHandler</Add>
<Add>System.Web.StaticFileHandler</Add>
<Add>System.Web.Handlers.AssemblyResourceLoader</Add>
<Add>System.Web.Optimization.BundleHandler</Add>
<Add>System.Web.Script.Services.ScriptHandlerFactory</Add>
<Add>System.Web.Handlers.TraceHandler</Add>
<Add>System.Web.Services.Discovery.DiscoveryRequestHandler</Add>
<Add>System.Web.HttpDebugHandler</Add>
</Handlers>
</Add>
<Add Type="Microsoft.ApplicationInsights.Web.ExceptionTrackingTelemetryModule, Microsoft.AI.Web" />
<Add Type="Microsoft.ApplicationInsights.Web.AspNetDiagnosticTelemetryModule, Microsoft.AI.Web" />
</TelemetryModules>
<TelemetryProcessors>
<Add Type="Microsoft.ApplicationInsights.Extensibility.PerfCounterCollector.QuickPulse.QuickPulseTelemetryProcessor, Microsoft.AI.PerfCounterCollector" />
<Add Type="Microsoft.ApplicationInsights.Extensibility.AutocollectedMetricsExtractor, Microsoft.ApplicationInsights" />
<Add Type="Microsoft.ApplicationInsights.WindowsServer.TelemetryChannel.AdaptiveSamplingTelemetryProcessor, Microsoft.AI.ServerTelemetryChannel">
<MaxTelemetryItemsPerSecond>5</MaxTelemetryItemsPerSecond>
<ExcludedTypes>Event</ExcludedTypes>
</Add>
<Add Type="Microsoft.ApplicationInsights.WindowsServer.TelemetryChannel.AdaptiveSamplingTelemetryProcessor, Microsoft.AI.ServerTelemetryChannel">
<MaxTelemetryItemsPerSecond>5</MaxTelemetryItemsPerSecond>
<IncludedTypes>Event</IncludedTypes>
</Add>
</TelemetryProcessors>
<TelemetryChannel Type="Microsoft.ApplicationInsights.WindowsServer.TelemetryChannel.ServerTelemetryChannel, Microsoft.AI.ServerTelemetryChannel" />
<!--
Learn more about Application Insights configuration with ApplicationInsights.config here:
http://go.microsoft.com/fwlink/?LinkID=513840
Note: If not present, please add <InstrumentationKey>Your Key</InstrumentationKey> to the top of this file.
-->
<InstrumentationKey>0bf8d80a-82a1-4966-947c-9d7b15bf42d8</InstrumentationKey>
</ApplicationInsights>

Просмотреть файл

@ -0,0 +1,7 @@
{
"ProviderId": "Microsoft.ApplicationInsights.ConnectedService.ConnectedServiceProvider",
"Version": "8.12.10405.1",
"GettingStartedDocument": {
"Uri": "https://go.microsoft.com/fwlink/?LinkID=613413"
}
}

Разница между файлами не показана из-за своего большого размера Загрузить разницу

1912
sketch2code/Sketch2Code.Web/Content/bootstrap-grid.css поставляемый Normal file

Разница между файлами не показана из-за своего большого размера Загрузить разницу

Различия файлов скрыты, потому что одна или несколько строк слишком длинны

7
sketch2code/Sketch2Code.Web/Content/bootstrap-grid.min.css поставляемый Normal file

Различия файлов скрыты, потому что одна или несколько строк слишком длинны

Различия файлов скрыты, потому что одна или несколько строк слишком длинны

330
sketch2code/Sketch2Code.Web/Content/bootstrap-reboot.css поставляемый Normal file
Просмотреть файл

@ -0,0 +1,330 @@
/*!
* Bootstrap Reboot v4.1.1 (https://getbootstrap.com/)
* Copyright 2011-2018 The Bootstrap Authors
* Copyright 2011-2018 Twitter, Inc.
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
* Forked from Normalize.css, licensed MIT (https://github.com/necolas/normalize.css/blob/master/LICENSE.md)
*/
*,
*::before,
*::after {
box-sizing: border-box;
}
html {
font-family: sans-serif;
line-height: 1.15;
-webkit-text-size-adjust: 100%;
-ms-text-size-adjust: 100%;
-ms-overflow-style: scrollbar;
-webkit-tap-highlight-color: transparent;
}
@-ms-viewport {
width: device-width;
}
article, aside, figcaption, figure, footer, header, hgroup, main, nav, section {
display: block;
}
body {
margin: 0;
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol";
font-size: 1rem;
font-weight: 400;
line-height: 1.5;
color: #212529;
text-align: left;
background-color: #fff;
}
[tabindex="-1"]:focus {
outline: 0 !important;
}
hr {
box-sizing: content-box;
height: 0;
overflow: visible;
}
h1, h2, h3, h4, h5, h6 {
margin-top: 0;
margin-bottom: 0.5rem;
}
p {
margin-top: 0;
margin-bottom: 1rem;
}
abbr[title],
abbr[data-original-title] {
text-decoration: underline;
-webkit-text-decoration: underline dotted;
text-decoration: underline dotted;
cursor: help;
border-bottom: 0;
}
address {
margin-bottom: 1rem;
font-style: normal;
line-height: inherit;
}
ol,
ul,
dl {
margin-top: 0;
margin-bottom: 1rem;
}
ol ol,
ul ul,
ol ul,
ul ol {
margin-bottom: 0;
}
dt {
font-weight: 700;
}
dd {
margin-bottom: .5rem;
margin-left: 0;
}
blockquote {
margin: 0 0 1rem;
}
dfn {
font-style: italic;
}
b,
strong {
font-weight: bolder;
}
small {
font-size: 80%;
}
sub,
sup {
position: relative;
font-size: 75%;
line-height: 0;
vertical-align: baseline;
}
sub {
bottom: -.25em;
}
sup {
top: -.5em;
}
a {
color: #007bff;
text-decoration: none;
background-color: transparent;
-webkit-text-decoration-skip: objects;
}
a:hover {
color: #0056b3;
text-decoration: underline;
}
a:not([href]):not([tabindex]) {
color: inherit;
text-decoration: none;
}
a:not([href]):not([tabindex]):hover, a:not([href]):not([tabindex]):focus {
color: inherit;
text-decoration: none;
}
a:not([href]):not([tabindex]):focus {
outline: 0;
}
pre,
code,
kbd,
samp {
font-family: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;
font-size: 1em;
}
pre {
margin-top: 0;
margin-bottom: 1rem;
overflow: auto;
-ms-overflow-style: scrollbar;
}
figure {
margin: 0 0 1rem;
}
img {
vertical-align: middle;
border-style: none;
}
svg:not(:root) {
overflow: hidden;
}
table {
border-collapse: collapse;
}
caption {
padding-top: 0.75rem;
padding-bottom: 0.75rem;
color: #6c757d;
text-align: left;
caption-side: bottom;
}
th {
text-align: inherit;
}
label {
display: inline-block;
margin-bottom: 0.5rem;
}
button {
border-radius: 0;
}
button:focus {
outline: 1px dotted;
outline: 5px auto -webkit-focus-ring-color;
}
input,
button,
select,
optgroup,
textarea {
margin: 0;
font-family: inherit;
font-size: inherit;
line-height: inherit;
}
button,
input {
overflow: visible;
}
button,
select {
text-transform: none;
}
button,
html [type="button"],
[type="reset"],
[type="submit"] {
-webkit-appearance: button;
}
button::-moz-focus-inner,
[type="button"]::-moz-focus-inner,
[type="reset"]::-moz-focus-inner,
[type="submit"]::-moz-focus-inner {
padding: 0;
border-style: none;
}
input[type="radio"],
input[type="checkbox"] {
box-sizing: border-box;
padding: 0;
}
input[type="date"],
input[type="time"],
input[type="datetime-local"],
input[type="month"] {
-webkit-appearance: listbox;
}
textarea {
overflow: auto;
resize: vertical;
}
fieldset {
min-width: 0;
padding: 0;
margin: 0;
border: 0;
}
legend {
display: block;
width: 100%;
max-width: 100%;
padding: 0;
margin-bottom: .5rem;
font-size: 1.5rem;
line-height: inherit;
color: inherit;
white-space: normal;
}
progress {
vertical-align: baseline;
}
[type="number"]::-webkit-inner-spin-button,
[type="number"]::-webkit-outer-spin-button {
height: auto;
}
[type="search"] {
outline-offset: -2px;
-webkit-appearance: none;
}
[type="search"]::-webkit-search-cancel-button,
[type="search"]::-webkit-search-decoration {
-webkit-appearance: none;
}
::-webkit-file-upload-button {
font: inherit;
-webkit-appearance: button;
}
output {
display: inline-block;
}
summary {
display: list-item;
cursor: pointer;
}
template {
display: none;
}
[hidden] {
display: none !important;
}
/*# sourceMappingURL=bootstrap-reboot.css.map */

Различия файлов скрыты, потому что одна или несколько строк слишком длинны

8
sketch2code/Sketch2Code.Web/Content/bootstrap-reboot.min.css поставляемый Normal file
Просмотреть файл

@ -0,0 +1,8 @@
/*!
* Bootstrap Reboot v4.1.1 (https://getbootstrap.com/)
* Copyright 2011-2018 The Bootstrap Authors
* Copyright 2011-2018 Twitter, Inc.
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
* Forked from Normalize.css, licensed MIT (https://github.com/necolas/normalize.css/blob/master/LICENSE.md)
*/*,::after,::before{box-sizing:border-box}html{font-family:sans-serif;line-height:1.15;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%;-ms-overflow-style:scrollbar;-webkit-tap-highlight-color:transparent}@-ms-viewport{width:device-width}article,aside,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}body{margin:0;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol";font-size:1rem;font-weight:400;line-height:1.5;color:#212529;text-align:left;background-color:#fff}[tabindex="-1"]:focus{outline:0!important}hr{box-sizing:content-box;height:0;overflow:visible}h1,h2,h3,h4,h5,h6{margin-top:0;margin-bottom:.5rem}p{margin-top:0;margin-bottom:1rem}abbr[data-original-title],abbr[title]{text-decoration:underline;-webkit-text-decoration:underline dotted;text-decoration:underline dotted;cursor:help;border-bottom:0}address{margin-bottom:1rem;font-style:normal;line-height:inherit}dl,ol,ul{margin-top:0;margin-bottom:1rem}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}dt{font-weight:700}dd{margin-bottom:.5rem;margin-left:0}blockquote{margin:0 0 1rem}dfn{font-style:italic}b,strong{font-weight:bolder}small{font-size:80%}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}a{color:#007bff;text-decoration:none;background-color:transparent;-webkit-text-decoration-skip:objects}a:hover{color:#0056b3;text-decoration:underline}a:not([href]):not([tabindex]){color:inherit;text-decoration:none}a:not([href]):not([tabindex]):focus,a:not([href]):not([tabindex]):hover{color:inherit;text-decoration:none}a:not([href]):not([tabindex]):focus{outline:0}code,kbd,pre,samp{font-family:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;font-size:1em}pre{margin-top:0;margin-bottom:1rem;overflow:auto;-ms-overflow-style:scrollbar}figure{margin:0 0 1rem}img{vertical-align:middle;border-style:none}svg:not(:root){overflow:hidden}table{border-collapse:collapse}caption{padding-top:.75rem;padding-bottom:.75rem;color:#6c757d;text-align:left;caption-side:bottom}th{text-align:inherit}label{display:inline-block;margin-bottom:.5rem}button{border-radius:0}button:focus{outline:1px dotted;outline:5px auto -webkit-focus-ring-color}button,input,optgroup,select,textarea{margin:0;font-family:inherit;font-size:inherit;line-height:inherit}button,input{overflow:visible}button,select{text-transform:none}[type=reset],[type=submit],button,html [type=button]{-webkit-appearance:button}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{padding:0;border-style:none}input[type=checkbox],input[type=radio]{box-sizing:border-box;padding:0}input[type=date],input[type=datetime-local],input[type=month],input[type=time]{-webkit-appearance:listbox}textarea{overflow:auto;resize:vertical}fieldset{min-width:0;padding:0;margin:0;border:0}legend{display:block;width:100%;max-width:100%;padding:0;margin-bottom:.5rem;font-size:1.5rem;line-height:inherit;color:inherit;white-space:normal}progress{vertical-align:baseline}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{outline-offset:-2px;-webkit-appearance:none}[type=search]::-webkit-search-cancel-button,[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{font:inherit;-webkit-appearance:button}output{display:inline-block}summary{display:list-item;cursor:pointer}template{display:none}[hidden]{display:none!important}
/*# sourceMappingURL=bootstrap-reboot.min.css.map */

Различия файлов скрыты, потому что одна или несколько строк слишком длинны

8981
sketch2code/Sketch2Code.Web/Content/bootstrap.css поставляемый Normal file

Разница между файлами не показана из-за своего большого размера Загрузить разницу

Различия файлов скрыты, потому что одна или несколько строк слишком длинны

6
sketch2code/Sketch2Code.Web/Content/bootstrap.min.css поставляемый Normal file

Различия файлов скрыты, потому что одна или несколько строк слишком длинны

Различия файлов скрыты, потому что одна или несколько строк слишком длинны

Просмотреть файл

@ -0,0 +1,488 @@
<?xml version="1.0" encoding="utf-8"?>
<GroupBox xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<IsEmpty>false</IsEmpty>
<X>34.2988701696</X>
<Y>25.2746002944</Y>
<Height>263.50935940799997</Height>
<Width>1764.9099072000001</Width>
<Groups>
<GroupBox>
<IsEmpty>false</IsEmpty>
<X>34.2988701696</X>
<Y>25.2746002944</Y>
<Height>262.914561504</Height>
<Width>1196.898718752</Width>
<Groups />
<Boxes>
<BoundingBox>
<Code>b3</Code>
<X>34.2988701696</X>
<Y>25.2746002944</Y>
<Height>262.914561504</Height>
<Width>1196.898718752</Width>
</BoundingBox>
</Boxes>
<Direction>Horizontal</Direction>
</GroupBox>
<GroupBox>
<IsEmpty>true</IsEmpty>
<X>0</X>
<Y>0</Y>
<Height>0</Height>
<Width>0</Width>
<Groups />
<Boxes />
<Direction>Horizontal</Direction>
</GroupBox>
<GroupBox>
<IsEmpty>false</IsEmpty>
<X>97.08849216</X>
<Y>319.82649119999996</Y>
<Height>151.1656641432</Height>
<Width>562.735854144</Width>
<Groups>
<GroupBox>
<IsEmpty>false</IsEmpty>
<X>97.08849216</X>
<Y>319.82649119999996</Y>
<Height>144.715248</Height>
<Width>302.464386144</Width>
<Groups />
<Boxes>
<BoundingBox>
<Code>b4</Code>
<X>97.08849216</X>
<Y>319.82649119999996</Y>
<Height>144.715248</Height>
<Width>302.464386144</Width>
</BoundingBox>
</Boxes>
<Direction>Vertical</Direction>
</GroupBox>
<GroupBox>
<IsEmpty>true</IsEmpty>
<X>0</X>
<Y>0</Y>
<Height>0</Height>
<Width>0</Width>
<Groups />
<Boxes />
<Direction>Vertical</Direction>
</GroupBox>
<GroupBox>
<IsEmpty>false</IsEmpty>
<X>1230.469056</X>
<Y>319.82649119999996</Y>
<Height>151.1656641432</Height>
<Width>562.735854144</Width>
<Groups />
<Boxes>
<BoundingBox>
<Code>b7</Code>
<X>1230.469056</X>
<Y>319.82649119999996</Y>
<Height>151.1656641432</Height>
<Width>562.735854144</Width>
</BoundingBox>
</Boxes>
<Direction>Vertical</Direction>
</GroupBox>
</Groups>
<Boxes />
<Direction>Horizontal</Direction>
</GroupBox>
<GroupBox>
<IsEmpty>true</IsEmpty>
<X>0</X>
<Y>0</Y>
<Height>0</Height>
<Width>0</Width>
<Groups />
<Boxes />
<Direction>Horizontal</Direction>
</GroupBox>
<GroupBox>
<IsEmpty>false</IsEmpty>
<X>36.8969779584</X>
<Y>495.99215534319995</Y>
<Height>263.50935940799997</Height>
<Width>1344.3913440000001</Width>
<Groups>
<GroupBox>
<IsEmpty>false</IsEmpty>
<X>36.8969779584</X>
<Y>495.99215534319995</Y>
<Height>178.98103530720002</Height>
<Width>1155.5833248000001</Width>
<Groups />
<Boxes>
<BoundingBox>
<Code>b10</Code>
<X>36.8969779584</X>
<Y>495.99215534319995</Y>
<Height>178.98103530720002</Height>
<Width>1155.5833248000001</Width>
</BoundingBox>
</Boxes>
<Direction>Vertical</Direction>
</GroupBox>
<GroupBox>
<IsEmpty>true</IsEmpty>
<X>0</X>
<Y>0</Y>
<Height>0</Height>
<Width>0</Width>
<Groups />
<Boxes />
<Direction>Vertical</Direction>
</GroupBox>
<GroupBox>
<IsEmpty>false</IsEmpty>
<X>1217.4803027584</X>
<Y>495.99215534319995</Y>
<Height>263.50935940799997</Height>
<Width>1344.3913440000001</Width>
<Groups />
<Boxes>
<BoundingBox>
<Code>b11</Code>
<X>1217.4803027584</X>
<Y>495.99215534319995</Y>
<Height>263.50935940799997</Height>
<Width>1344.3913440000001</Width>
</BoundingBox>
</Boxes>
<Direction>Vertical</Direction>
</GroupBox>
</Groups>
<Boxes />
<Direction>Horizontal</Direction>
</GroupBox>
<GroupBox>
<IsEmpty>true</IsEmpty>
<X>0</X>
<Y>0</Y>
<Height>0</Height>
<Width>0</Width>
<Groups />
<Boxes />
<Direction>Horizontal</Direction>
</GroupBox>
<GroupBox>
<IsEmpty>false</IsEmpty>
<X>56.5179311808</X>
<Y>784.76566876719994</Y>
<Height>155.78473392</Height>
<Width>492.367984128</Width>
<Groups>
<GroupBox>
<IsEmpty>false</IsEmpty>
<X>56.5179311808</X>
<Y>784.76566876719994</Y>
<Height>155.78473392</Height>
<Width>421.7156136</Width>
<Groups />
<Boxes>
<BoundingBox>
<Code>b5</Code>
<X>56.5179311808</X>
<Y>784.76566876719994</Y>
<Height>155.78473392</Height>
<Width>421.7156136</Width>
</BoundingBox>
</Boxes>
<Direction>Vertical</Direction>
</GroupBox>
<GroupBox>
<IsEmpty>true</IsEmpty>
<X>0</X>
<Y>0</Y>
<Height>0</Height>
<Width>0</Width>
<Groups />
<Boxes />
<Direction>Vertical</Direction>
</GroupBox>
<GroupBox>
<IsEmpty>false</IsEmpty>
<X>1187.6585472</X>
<Y>784.76566876719994</Y>
<Height>153.84341664</Height>
<Width>492.367984128</Width>
<Groups />
<Boxes>
<BoundingBox>
<Code>b6</Code>
<X>1187.6585472</X>
<Y>784.76566876719994</Y>
<Height>153.84341664</Height>
<Width>492.367984128</Width>
</BoundingBox>
</Boxes>
<Direction>Vertical</Direction>
</GroupBox>
</Groups>
<Boxes />
<Direction>Horizontal</Direction>
</GroupBox>
<GroupBox>
<IsEmpty>true</IsEmpty>
<X>0</X>
<Y>0</Y>
<Height>0</Height>
<Width>0</Width>
<Groups />
<Boxes />
<Direction>Horizontal</Direction>
</GroupBox>
<GroupBox>
<IsEmpty>false</IsEmpty>
<X>39.1346098272</X>
<Y>965.5504026872</Y>
<Height>184.9031712</Height>
<Width>1231.081719264</Width>
<Groups>
<GroupBox>
<IsEmpty>false</IsEmpty>
<X>39.1346098272</X>
<Y>965.5504026872</Y>
<Height>184.9031712</Height>
<Width>1125.7947648</Width>
<Groups />
<Boxes>
<BoundingBox>
<Code>b13</Code>
<X>39.1346098272</X>
<Y>965.5504026872</Y>
<Height>184.9031712</Height>
<Width>1125.7947648</Width>
</BoundingBox>
</Boxes>
<Direction>Vertical</Direction>
</GroupBox>
<GroupBox>
<IsEmpty>true</IsEmpty>
<X>0</X>
<Y>0</Y>
<Height>0</Height>
<Width>0</Width>
<Groups />
<Boxes />
<Direction>Vertical</Direction>
</GroupBox>
<GroupBox>
<IsEmpty>false</IsEmpty>
<X>1204.572962016</X>
<Y>965.5504026872</Y>
<Height>172.73452824</Height>
<Width>1231.081719264</Width>
<Groups />
<Boxes>
<BoundingBox>
<Code>b12</Code>
<X>1204.572962016</X>
<Y>965.5504026872</Y>
<Height>172.73452824</Height>
<Width>1231.081719264</Width>
</BoundingBox>
</Boxes>
<Direction>Vertical</Direction>
</GroupBox>
</Groups>
<Boxes />
<Direction>Horizontal</Direction>
</GroupBox>
<GroupBox>
<IsEmpty>true</IsEmpty>
<X>0</X>
<Y>0</Y>
<Height>0</Height>
<Width>0</Width>
<Groups />
<Boxes />
<Direction>Horizontal</Direction>
</GroupBox>
<GroupBox>
<IsEmpty>false</IsEmpty>
<X>59.488391952</X>
<Y>1209.9311331671997</Y>
<Height>170.9609976</Height>
<Width>824.196568032</Width>
<Groups>
<GroupBox>
<IsEmpty>false</IsEmpty>
<X>59.488391952</X>
<Y>1209.9311331671997</Y>
<Height>170.9609976</Height>
<Width>522.6861312</Width>
<Groups />
<Boxes>
<BoundingBox>
<Code>b8</Code>
<X>59.488391952</X>
<Y>1209.9311331671997</Y>
<Height>170.9609976</Height>
<Width>522.6861312</Width>
</BoundingBox>
</Boxes>
<Direction>Vertical</Direction>
</GroupBox>
<GroupBox>
<IsEmpty>true</IsEmpty>
<X>0</X>
<Y>0</Y>
<Height>0</Height>
<Width>0</Width>
<Groups />
<Boxes />
<Direction>Vertical</Direction>
</GroupBox>
<GroupBox>
<IsEmpty>false</IsEmpty>
<X>1242.285403392</X>
<Y>1209.9311331671997</Y>
<Height>163.7364132</Height>
<Width>824.196568032</Width>
<Groups />
<Boxes>
<BoundingBox>
<Code>b9</Code>
<X>1242.285403392</X>
<Y>1209.9311331671997</Y>
<Height>163.7364132</Height>
<Width>824.196568032</Width>
</BoundingBox>
</Boxes>
<Direction>Vertical</Direction>
</GroupBox>
</Groups>
<Boxes />
<Direction>Horizontal</Direction>
</GroupBox>
<GroupBox>
<IsEmpty>true</IsEmpty>
<X>0</X>
<Y>0</Y>
<Height>0</Height>
<Width>0</Width>
<Groups />
<Boxes />
<Direction>Horizontal</Direction>
</GroupBox>
<GroupBox>
<IsEmpty>false</IsEmpty>
<X>86.5769306112</X>
<Y>1405.8921307671997</Y>
<Height>198.77546772</Height>
<Width>1271.591136</Width>
<Groups>
<GroupBox>
<IsEmpty>false</IsEmpty>
<X>86.5769306112</X>
<Y>1405.8921307671997</Y>
<Height>152.42318856</Height>
<Width>1126.444719168</Width>
<Groups />
<Boxes>
<BoundingBox>
<Code>b14</Code>
<X>86.5769306112</X>
<Y>1405.8921307671997</Y>
<Height>152.42318856</Height>
<Width>1126.444719168</Width>
</BoundingBox>
</Boxes>
<Direction>Vertical</Direction>
</GroupBox>
<GroupBox>
<IsEmpty>true</IsEmpty>
<X>0</X>
<Y>0</Y>
<Height>0</Height>
<Width>0</Width>
<Groups />
<Boxes />
<Direction>Vertical</Direction>
</GroupBox>
<GroupBox>
<IsEmpty>false</IsEmpty>
<X>1238.0216497791998</X>
<Y>1405.8921307671997</Y>
<Height>198.77546772</Height>
<Width>1271.591136</Width>
<Groups />
<Boxes>
<BoundingBox>
<Code>b15</Code>
<X>1238.0216497791998</X>
<Y>1405.8921307671997</Y>
<Height>198.77546772</Height>
<Width>1271.591136</Width>
</BoundingBox>
</Boxes>
<Direction>Vertical</Direction>
</GroupBox>
</Groups>
<Boxes />
<Direction>Horizontal</Direction>
</GroupBox>
<GroupBox>
<IsEmpty>true</IsEmpty>
<X>0</X>
<Y>0</Y>
<Height>0</Height>
<Width>0</Width>
<Groups />
<Boxes />
<Direction>Horizontal</Direction>
</GroupBox>
<GroupBox>
<IsEmpty>false</IsEmpty>
<X>124.32880512</X>
<Y>1660.0861363111994</Y>
<Height>260.501221584</Height>
<Width>1764.9099072000001</Width>
<Groups />
<Boxes>
<BoundingBox>
<Code>b2</Code>
<X>124.32880512</X>
<Y>1660.0861363111994</Y>
<Height>260.501221584</Height>
<Width>1764.9099072000001</Width>
</BoundingBox>
</Boxes>
<Direction>Horizontal</Direction>
</GroupBox>
<GroupBox>
<IsEmpty>true</IsEmpty>
<X>0</X>
<Y>0</Y>
<Height>0</Height>
<Width>0</Width>
<Groups />
<Boxes />
<Direction>Horizontal</Direction>
</GroupBox>
<GroupBox>
<IsEmpty>false</IsEmpty>
<X>1688.592178944</X>
<Y>1945.5873578951994</Y>
<Height>217.836897048</Height>
<Width>764.08772256</Width>
<Groups />
<Boxes>
<BoundingBox>
<Code>b1</Code>
<X>1688.592178944</X>
<Y>1945.5873578951994</Y>
<Height>217.836897048</Height>
<Width>764.08772256</Width>
</BoundingBox>
</Boxes>
<Direction>Horizontal</Direction>
</GroupBox>
</Groups>
<Boxes />
<Direction>Vertical</Direction>
</GroupBox>

Двоичные данные
sketch2code/Sketch2Code.Web/Content/fonts/octicons.eot Normal file

Двоичный файл не отображается.

Просмотреть файл

@ -0,0 +1,188 @@
<?xml version="1.0" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg xmlns="http://www.w3.org/2000/svg">
<metadata>
(c) 2012-2016 GitHub
When using the GitHub logos, be sure to follow the GitHub logo guidelines (https://github.com/logos)
Font License: SIL OFL 1.1 (http://scripts.sil.org/OFL)
Applies to all font files
Code License: MIT (http://choosealicense.com/licenses/mit/)
Applies to all other files
</metadata>
<defs>
<font id="octicons" horiz-adv-x="1024" >
<font-face font-family="octicons" font-weight="400" font-stretch="normal" units-per-em="1024" ascent="832" descent="-192" />
<missing-glyph d="M512 832C229.25 832 0 602.75 0 320c0-226.25 146.688-418.125 350.156-485.812 25.594-4.688 34.938 11.125 34.938 24.625 0 12.188-0.469 52.562-0.719 95.312C242-76.81200000000001 211.906 14.5 211.906 14.5c-23.312 59.125-56.844 74.875-56.844 74.875-46.531 31.75 3.53 31.125 3.53 31.125 51.406-3.562 78.47-52.75 78.47-52.75 45.688-78.25 119.875-55.625 149-42.5 4.654 33 17.904 55.625 32.5 68.375C304.906 106.56200000000001 185.344 150.5 185.344 346.688c0 55.938 19.969 101.562 52.656 137.406-5.219 13-22.844 65.094 5.062 135.562 0 0 42.938 13.75 140.812-52.5 40.812 11.406 84.594 17.031 128.125 17.219 43.5-0.188 87.312-5.875 128.188-17.281 97.688 66.312 140.688 52.5 140.688 52.5 28-70.531 10.375-122.562 5.125-135.5 32.812-35.844 52.625-81.469 52.625-137.406 0-196.688-119.75-240-233.812-252.688 18.438-15.875 34.75-47 34.75-94.75 0-68.438-0.688-123.625-0.688-140.5 0-13.625 9.312-29.562 35.25-24.562C877.438-98 1024 93.875 1024 320 1024 602.75 794.75 832 512 832z" horiz-adv-x="1024" />
<glyph glyph-name="alert" unicode="&#xf02d;" d="M1005.854 31.753000000000043l-438.286 767C556.173 818.694 534.967 831 512 831s-44.173-12.306-55.567-32.247l-438.286-767c-11.319-19.809-11.238-44.144 0.213-63.876C29.811-51.85500000000002 50.899-64 73.714-64h876.572c22.814 0 43.903 12.145 55.354 31.877S1017.173 11.94399999999996 1005.854 31.753000000000043zM576 64H448V192h128V64zM576 256H448V512h128V256z" horiz-adv-x="1024" />
<glyph glyph-name="arrow-down" unicode="&#xf03f;" d="M448 384V640H192v-256H0l320-384 320 384H448z" horiz-adv-x="640" />
<glyph glyph-name="arrow-left" unicode="&#xf040;" d="M384 448V640L0 320l384-320V192h256V448H384z" horiz-adv-x="640" />
<glyph glyph-name="arrow-right" unicode="&#xf03e;" d="M640 320L256 640v-192H0v-256h256v-192L640 320z" horiz-adv-x="640" />
<glyph glyph-name="arrow-small-down" unicode="&#xf0a0;" d="M256 384V512H128v-128H0l192-256 192 256H256z" horiz-adv-x="384" />
<glyph glyph-name="arrow-small-left" unicode="&#xf0a1;" d="M256 384V512L0 320l256-192V256h128V384H256z" horiz-adv-x="384" />
<glyph glyph-name="arrow-small-right" unicode="&#xf071;" d="M384 320L128 512v-128H0v-128h128v-128L384 320z" horiz-adv-x="384" />
<glyph glyph-name="arrow-small-up" unicode="&#xf09f;" d="M192 512L0 256h128v-128h128V256h128L192 512z" horiz-adv-x="384" />
<glyph glyph-name="arrow-up" unicode="&#xf03d;" d="M320 640L0 256h192v-256h256V256h192L320 640z" horiz-adv-x="640" />
<glyph glyph-name="beaker" unicode="&#xf0dd;" d="M920-102L704 384V640h64v64H192v-64h64v-256L40-102c-19-42 12-90 58-90h764c46 0 77 48 58 90zM240 192l80 192V640h320v-256l80-192H240z m272 128h64v-64h-64v64z m-64 64h-64v64h64v-64z m0 192h64v-64h-64v64z m0 192h-64V832h64v-64z" horiz-adv-x="1024" />
<glyph glyph-name="bell" unicode="&#xf0de;" d="M896 64v-64H0v64l47 37c49 49 52 163 76 283 49 241 261 320 261 320 0 35 29 64 64 64s64-29 64-64c0 0 217-79 266-320 24-120 27-234 76-283l42-37z m-448-256c71 0 128 57 128 128H320c0-71 57-128 128-128z" horiz-adv-x="896" />
<glyph glyph-name="bold" unicode="&#xf0e2;" d="M0 704h245c159 0 275-48 275-189 0-73-40-143-107-167v-4c85-19 147-79 147-183 0-153-126-225-295-225H0V704z m234-317c107 0 152 42 152 108 0 75-50 103-150 103H136v-211h98z m17-345c113 0 176 41 176 127 0 81-61 116-176 116H136v-243h115z" horiz-adv-x="640" />
<glyph glyph-name="book" unicode="&#xf007;" d="M128 512h256v-64H128v64z m0-192h256v64H128v-64z m0-128h256v64H128v-64z m704 320H576v-64h256v64z m0-128H576v-64h256v64z m0-128H576v-64h256v64z m128 384v-576c0-35-29-64-64-64H544l-64-64-64 64H64c-35 0-64 29-64 64V640c0 35 29 64 64 64h352l64-64 64 64h352c35 0 64-29 64-64z m-512-32l-32 32H64v-576h384V608z m448 32H544l-32-32v-544h384V640z" horiz-adv-x="1024" />
<glyph glyph-name="bookmark" unicode="&#xf07b;" d="M576 832H64C17 832 0 815 0 768v-960l320 198 320-198V768c0 47-17 64-64 64z m-50-272l-119-87 46-138c4-14-1-18-13-11l-120 86-120-86c-12-7-16-3-13 11l46 138-119 87c-11 10-9 15 6 15l147 2 45 138h16l45-138 147-2c15 0 17-5 6-15z" horiz-adv-x="640" />
<glyph glyph-name="briefcase" unicode="&#xf0d3;" d="M576 576v64c0 35-29 64-64 64H384c-35 0-64-29-64-64v-64H64c-35 0-64-29-64-64v-512c0-35 29-64 64-64h768c35 0 64 29 64 64V512c0 35-29 64-64 64H576z m-192 64h128v-64H384v64z m448-384H512v-64H384v64H64V512h64v-192h640V512h64v-256z" horiz-adv-x="896" />
<glyph glyph-name="broadcast" unicode="&#xf048;" d="M576 256h-64c35 0 64 29 64 64v64c0 35-29 64-64 64h-64c-35 0-64-29-64-64v-64c0-35 29-64 64-64h-64c-35 0-64-29-64-64v-128h64v-192c0-35 29-64 64-64h64c35 0 64 29 64 64V64h64V192c0 35-29 64-64 64zM448 384h64v-64h-64v64z m128-256h-64v-256h-64V128h-64v64h192v-64z m134 224c0 127-103 230-230 230S250 479 250 352c0-18 2-35 6-52v-127c-39 49-64 111-64 179 0 159 129 288 288 288s288-129 288-288c0-68-25-130-64-179V300c4 17 6 34 6 52z m250 0c0-184-104-344-256-424v67c119 74 198 206 198 357 0 233-189 422-422 422S58 585 58 352c0-151 79-283 198-357v-67C104 8 0 168 0 352 0 617 215 832 480 832s480-215 480-480z" horiz-adv-x="1024" />
<glyph glyph-name="browser" unicode="&#xf0c5;" d="M320 640h64v-64h-64V640zM192 640h64v-64h-64V640zM64 640h64v-64H64V640zM832 0H64V512h768V0zM832 576H448v64h384V576zM896 640c0 35.35-28.65 64-64 64H64c-35.35 0-64-28.65-64-64v-640c0-35.35 28.65-64 64-64h768c35.35 0 64 28.65 64 64V640z" horiz-adv-x="896" />
<glyph glyph-name="bug" unicode="&#xf091;" d="M704 192h192v64H704v64l203 66-22 60-181-62v64c0 35-29 64-64 64v64c0 31-23 56-53 62l66 66h115V768H627L499 640h-38L333 768H192v-64h115l66-66c-30-6-53-31-53-62v-64c-35 0-64-29-64-64v-64L75 446l-22-60 203-66v-64H64v-64h192v-64L53 62l22-60 181 62v-64c0-35 29-64 64-64h64l64 64V448h64v-448l64-64h64c35 0 64 29 64 64v64l181-62 22 60-203 66v64zM576 512H384v64h192v-64z" horiz-adv-x="1024" />
<glyph glyph-name="calendar" unicode="&#xf068;" d="M768 704h-64v-96c0-18-14-32-32-32H544c-18 0-32 14-32 32v96H320v-96c0-18-14-32-32-32H160c-18 0-32 14-32 32v96H64c-35 0-64-29-64-64v-704c0-35 29-64 64-64h704c35 0 64 29 64 64V640c0 35-29 64-64 64z m0-768H64V512h704v-576zM256 640h-64V768h64v-128z m384 0h-64V768h64v-128zM320 384h-64v64h64v-64z m128 0h-64v64h64v-64z m128 0h-64v64h64v-64z m128 0h-64v64h64v-64zM192 256h-64v64h64v-64z m128 0h-64v64h64v-64z m128 0h-64v64h64v-64z m128 0h-64v64h64v-64z m128 0h-64v64h64v-64zM192 128h-64v64h64v-64z m128 0h-64v64h64v-64z m128 0h-64v64h64v-64z m128 0h-64v64h64v-64z m128 0h-64v64h64v-64zM192 0h-64v64h64v-64z m128 0h-64v64h64v-64z m128 0h-64v64h64v-64z m128 0h-64v64h64v-64z" horiz-adv-x="896" />
<glyph glyph-name="check" unicode="&#xf03a;" d="M768 512L256 0 0 256l96 96 160-160 416 416 96-96z" horiz-adv-x="768" />
<glyph glyph-name="checklist" unicode="&#xf076;" d="M1024 288L640-96 448 96l96 96 96-96 288 288 96-96zM365 51l51-51H128c-35 0-64 29-64 64V640c0 35 29 64 64 64h448c35 0 64-29 64-64v-416l-51 51c-25 25-66 25-91 0L365 141c-25-25-25-65 0-90zM256 576h320v64H256v-64z m0-128h320v64H256v-64z m0-128h192v64H256v-64z m-64-64h-64v-64h64v64z m0 128h-64v-64h64v64z m0 128h-64v-64h64v64z m0 128h-64v-64h64v64z" horiz-adv-x="1024" />
<glyph glyph-name="chevron-down" unicode="&#xf0a3;" d="M320 128L0 448l96 96 224-240 224 240 96-96-320-320z" horiz-adv-x="640" />
<glyph glyph-name="chevron-left" unicode="&#xf0a4;" d="M352 640l96-96-240-224 240-224-96-96L32 320l320 320z" horiz-adv-x="512" />
<glyph glyph-name="chevron-right" unicode="&#xf078;" d="M480 320L160 0l-96 96 240 224L64 544l96 96 320-320z" horiz-adv-x="512" />
<glyph glyph-name="chevron-up" unicode="&#xf0a2;" d="M640 256l-96-96-224 240L96 160 0 256l320 320 320-320z" horiz-adv-x="640" />
<glyph glyph-name="circle-slash" unicode="&#xf084;" d="M448 768C201 768 0 567 0 320s201-448 448-448 448 201 448 448S695 768 448 768z m0-83c83 0 160-28 222-75L158 98c-47 62-75 139-75 222 0 201 164 365 365 365z m0-730c-83 0-160 28-222 75l512 512c47-62 75-139 75-222 0-201-164-365-365-365z" horiz-adv-x="896" />
<glyph glyph-name="circuit-board" unicode="&#xf0d6;" d="M192 512c0 35 29 64 64 64s64-29 64-64-29-64-64-64-64 29-64 64z m512 0c0 35-29 64-64 64s-64-29-64-64 29-64 64-64 64 29 64 64z m0-384c0 35-29 64-64 64s-64-29-64-64 29-64 64-64 64 29 64 64zM832 768H320v-139c23-12 41-30 53-53h150c27 50 85 82 150 67 48-12 87-51 98-99 20-88-46-166-131-166-51 0-95 28-117 70H373c-27-51-85-82-150-66-47 11-86 50-97 97-16 65 15 123 66 150V768H64C29 768 0 739 0 704v-768c0-35 29-64 64-64l320 320h139c27 50 85 82 150 67 48-12 87-51 98-99 20-88-46-166-131-166-51 0-95 28-117 70h-75L256-128h576c35 0 64 29 64 64V704c0 35-29 64-64 64z" horiz-adv-x="896" />
<glyph glyph-name="clippy" unicode="&#xf035;" d="M128 64h256v-64H128v64z m320 384H128v-64h320v64z m128-192V384L384 192l192-192V128h320V256H576z m-288 64H128v-64h160v64zM128 128h160v64H128v-64z m576-64h64v-128c-1-18-7-33-19-45s-27-18-45-19H64c-35 0-64 29-64 64V640c0 35 29 64 64 64h192C256 775 313 832 384 832s128-57 128-128h192c35 0 64-29 64-64v-320h-64V512H64v-576h640V64zM128 576h512c0 35-29 64-64 64h-64c-35 0-64 29-64 64s-29 64-64 64-64-29-64-64-29-64-64-64h-64c-35 0-64-29-64-64z" horiz-adv-x="896" />
<glyph glyph-name="clock" unicode="&#xf046;" d="M512 320h192v-128H448c-35 0-64 29-64 64V576h128v-256z m-64 365c201 0 365-164 365-365S649-45 448-45 83 119 83 320s164 365 365 365m0 83C201 768 0 567 0 320s201-448 448-448 448 201 448 448S695 768 448 768z" horiz-adv-x="896" />
<glyph glyph-name="cloud-download" unicode="&#xf00b;" d="M576 0h128l-192-192-192 192h128V320h128v-320z m192 512c0 28-58 192-288 192-155 0-288-123-288-256C65 448 0 351 0 256c0-98 64-192 192-192 28 0 170 0 192 0v83H192C88 147 83 238 83 256c0 11 3 109 109 109h83v83c0 89 100 173 205 173 163 0 200-99 205-115v-77h83c52 0 173-14 173-141 0-134-144-141-173-141H640v-83c24 0 127 0 128 0 133 0 256 74 256 224 0 156-123 224-256 224z" horiz-adv-x="1024" />
<glyph glyph-name="cloud-upload" unicode="&#xf00c;" d="M448 256H320l192 192 192-192H576v-320H448V256z m320 256c0 28-58 192-288 192-155 0-288-123-288-256C65 448 0 351 0 256c0-98 64-192 192-192 28 0 170 0 192 0v83H192C88 147 83 238 83 256c0 11 3 109 109 109h83v83c0 89 100 173 205 173 163 0 200-99 205-115v-77h83c52 0 173-14 173-141 0-134-144-141-173-141H640v-83c24 0 127 0 128 0 133 0 256 74 256 224 0 156-123 224-256 224z" horiz-adv-x="1024" />
<glyph glyph-name="code" unicode="&#xf05f;" d="M608 640l-96-96 224-224L512 96l96-96 288 320L608 640zM288 640L0 320l288-320 96 96L160 320l224 224L288 640z" horiz-adv-x="896" />
<glyph glyph-name="comment" unicode="&#xf02b;" d="M832 704H64c-35 0-64-29-64-64v-512c0-35 29-64 64-64h128v-224l224 224h416c35 0 64 29 64 64V640c0 35-29 64-64 64z m0-576H384L256 0V128H64V640h768v-512z" horiz-adv-x="896" />
<glyph glyph-name="comment-discussion" unicode="&#xf04f;" d="M960 704H384c-35 0-64-29-64-64v-128H64c-35 0-64-29-64-64v-384c0-35 29-64 64-64h64v-192l192 192h256c35 0 64 29 64 64V192h64l192-192V192h64c35 0 64 29 64 64V640c0 35-29 64-64 64zM576 64H288l-96-96v96H64V448h256v-192c0-35 29-64 64-64h192v-128z m384 192H832v-96l-96 96H384V640h576v-384z" horiz-adv-x="1024" />
<glyph glyph-name="credit-card" unicode="&#xf045;" d="M768 256H128v64h640v-64z m256 384v-576c0-35-29-64-64-64H64c-35 0-64 29-64 64V640c0 35 29 64 64 64h896c35 0 64-29 64-64z m-64-192H64v-384h896V448z m0 192H64v-64h896v64zM384 192H128v-64h256v64z" horiz-adv-x="1024" />
<glyph glyph-name="dash" unicode="&#xf0ca;" d="M0 384v-128h512V384H0z" horiz-adv-x="512" />
<glyph glyph-name="dashboard" unicode="&#xf07d;" d="M512 512h-64v64h64v-64z m256-192h-64v-64h64v64zM320 512h-64v-64h64v64z m-64-192h-64v-64h64v64z m704 352l-32 32-416-320c-4 1-64 0-64 0-35 0-64-29-64-64v-64c0-35 29-64 64-64h64c35 0 64 29 64 64v59l384 357zM858 410c12-39 19-80 19-122 0-219-178-397-397-397S83 69 83 288s178 397 397 397c77 0 148-22 209-60l60 60c-76 52-169 83-269 83C215 768 0 553 0 288s215-480 480-480 480 215 480 480c0 66-13 129-38 186l-64-64z" horiz-adv-x="1024" />
<glyph glyph-name="database" unicode="&#xf096;" d="M384-128C171.969-128 0-70.625 0 0c0 38.625 0 80.875 0 128 0 11.125 5.562 21.688 13.562 32C56.375 104.875 205.25 64 384 64s327.625 40.875 370.438 96c8-10.312 13.562-20.875 13.562-32 0-37.062 0-76.375 0-128C768-70.625 596-128 384-128zM384 128C171.969 128 0 185.375 0 256c0 38.656 0 80.844 0 128 0 6.781 2.562 13.375 6 19.906l0 0C7.938 408 10.5 412.031 13.562 416 56.375 360.906 205.25 320 384 320s327.625 40.906 370.438 96c3.062-3.969 5.625-8 7.562-12.094l0 0c3.438-6.531 6-13.125 6-19.906 0-37.062 0-76.344 0-128C768 185.375 596 128 384 128zM384 384C171.969 384 0 441.344 0 512c0 20.219 0 41.594 0 64 0 20.344 0 41.469 0 64C0 710.656 171.969 768 384 768c212 0 384-57.344 384-128 0-19.969 0-41.156 0-64 0-19.594 0-40.25 0-64C768 441.344 596 384 384 384zM384 704c-141.375 0-256-28.594-256-64s114.625-64 256-64 256 28.594 256 64S525.375 704 384 704z" horiz-adv-x="768" />
<glyph glyph-name="desktop-download" unicode="&#xf0dc;" d="M256 448h192V832h128v-384h192L512 192 256 448z m704 256H704v-64h256v-512H64V640h256v64H64c-35 0-64-29-64-64v-576c0-35 29-64 64-64h342c-16-39-55-89-150-128h512c-95 39-134 89-150 128h342c35 0 64 29 64 64V640c0 35-29 64-64 64z" horiz-adv-x="1024" />
<glyph glyph-name="device-camera" unicode="&#xf056;" d="M960 640H448c0 35-29 64-64 64H128c-35 0-64-29-64-64-35 0-64-29-64-64v-576c0-35 29-64 64-64h896c35 0 64 29 64 64V576c0 35-29 64-64 64zM384 512H128v64h256v-64z m288-448c-124 0-224 100-224 224s100 224 224 224 224-100 224-224-100-224-224-224z m160 224c0-88-72-160-160-160s-160 72-160 160 72 160 160 160 160-72 160-160z" horiz-adv-x="1024" />
<glyph glyph-name="device-camera-video" unicode="&#xf057;" d="M973 634L640 402V576c0 35-29 64-64 64H64c-35 0-64-29-64-64v-576c0-35 29-64 64-64h512c35 0 64 29 64 64V174l333-232c21-15 51 0 51 26V608c0 26-30 41-51 26z" horiz-adv-x="1024" />
<glyph glyph-name="device-desktop" unicode="&#xf27c;" d="M960 704H64c-35 0-64-29-64-64v-576c0-35 29-64 64-64h342c-16-39-55-89-150-128h512c-95 39-134 89-150 128h342c35 0 64 29 64 64V640c0 35-29 64-64 64z m0-576H64V640h896v-512z" horiz-adv-x="1024" />
<glyph glyph-name="device-mobile" unicode="&#xf038;" d="M576 832H64C29 832 0 803 0 768v-896c0-35 29-64 64-64h512c35 0 64 29 64 64V768c0 35-29 64-64 64zM320-147c-46 0-83 37-83 83s37 83 83 83 83-37 83-83-37-83-83-83z m256 211H64V704h512v-640z" horiz-adv-x="640" />
<glyph glyph-name="diff" unicode="&#xf04d;" d="M384 384h128v-64H384v-128h-64V320H192v64h128V512h64v-128zM192 0h320v64H192v-64z m288 704l224-224v-608c0-35-29-64-64-64H64c-35 0-64 29-64 64V640c0 35 29 64 64 64h416z m160-256L448 640H64v-768h576V448zM544 832S192 832 192 832v-64h320l256-256v-512h64V544L544 832z" horiz-adv-x="896" />
<glyph glyph-name="diff-added" unicode="&#xf06b;" d="M832 768H64C29 768 0 739 0 704v-768c0-35 29-64 64-64h768c35 0 64 29 64 64V704c0 35-29 64-64 64z m0-832H64V704h768v-768zM384 256H192V384h192V576h128v-192h192v-128H512v-192H384V256z" horiz-adv-x="896" />
<glyph glyph-name="diff-ignored" unicode="&#xf099;" d="M832 768H64C29 768 0 739 0 704v-768c0-35 29-64 64-64h768c35 0 64 29 64 64V704c0 35-29 64-64 64z m0-832H64V704h768v-768zM288 64h-96v96l416 416h96v-96L288 64z" horiz-adv-x="896" />
<glyph glyph-name="diff-modified" unicode="&#xf06d;" d="M832 768H64C29 768 0 739 0 704v-768c0-35 29-64 64-64h768c35 0 64 29 64 64V704c0 35-29 64-64 64z m0-832H64V704h768v-768zM256 320c0 106 86 192 192 192s192-86 192-192-86-192-192-192-192 86-192 192z" horiz-adv-x="896" />
<glyph glyph-name="diff-removed" unicode="&#xf06c;" d="M832 768H64C29 768 0 739 0 704v-768c0-35 29-64 64-64h768c35 0 64 29 64 64V704c0 35-29 64-64 64z m0-832H64V704h768v-768zM704 256H192V384h512v-128z" horiz-adv-x="896" />
<glyph glyph-name="diff-renamed" unicode="&#xf06e;" d="M384 256H192V384h192V576l320-256-320-256V256z m512 448v-768c0-35-29-64-64-64H64c-35 0-64 29-64 64V704c0 35 29 64 64 64h768c35 0 64-29 64-64z m-64 0H64v-768h768V704z" horiz-adv-x="896" />
<glyph glyph-name="ellipsis" unicode="&#xf09a;" d="M704 512H64c-35 0-64-29-64-64v-256c0-35 29-64 64-64h640c35 0 64 29 64 64V448c0 35-29 64-64 64zM256 256H128V384h128v-128z m192 0H320V384h128v-128z m192 0H512V384h128v-128z" horiz-adv-x="768" />
<glyph glyph-name="eye" unicode="&#xf04e;" d="M516 704C192 704 0 320 0 320s192-384 516-384c316 0 508 384 508 384S832 704 516 704z m-4-640c-141 0-256 114-256 256 0 141 115 256 256 256 142 0 256-115 256-256 0-142-114-256-256-256z m128 256c0-71-57-128-128-128s-128 57-128 128 57 128 128 128 128-57 128-128z" horiz-adv-x="1024" />
<glyph glyph-name="file-binary" unicode="&#xf094;" d="M256 64h64v-64H128v64h64V192h-64v64h128v-192z m512 480v-608c0-35-29-64-64-64H64c-35 0-64 29-64 64V704c0 35 29 64 64 64h480l224-224z m-64-32L512 704H64v-768h640V512z m-192 64H384v-64h64v-128h-64v-64h192v64h-64V576z m-384 0h192v-256H128V576z m64-192h64V512h-64v-128z m192-128h192v-256H384V256z m64-192h64V192h-64v-128z" horiz-adv-x="768" />
<glyph glyph-name="file-code" unicode="&#xf010;" d="M544 768H64C29 768 0 739 0 704v-768c0-35 29-64 64-64h640c35 0 64 29 64 64V544L544 768z m160-832H64V704h448l192-192v-576zM320 385l-96-97 96-96-32-64-160 160 160 160 32-63z m160 63l160-160-160-160-32 63 96 97-96 96 32 64z" horiz-adv-x="768" />
<glyph glyph-name="file-directory" unicode="&#xf016;" d="M832 576H448v64c0 42-20 64-64 64H64c-35 0-64-29-64-64v-640c0-35 29-64 64-64h768c35 0 64 29 64 64V512c0 35-29 64-64 64z m-448 0H64v64h320v-64z" horiz-adv-x="896" />
<glyph glyph-name="file-media" unicode="&#xf012;" d="M384 512h128v-128H384V512z m384 32v-608c0-35-29-64-64-64H64c-35 0-64 29-64 64V704c0 35 29 64 64 64h480l224-224z m-64-32L512 704H64v-704l192 320 128-256 128 128 192-192V512z" horiz-adv-x="768" />
<glyph glyph-name="file-pdf" unicode="&#xf014;" d="M544 768H64C29 768 0 739 0 704v-768c0-35 29-64 64-64h640c35 0 64 29 64 64V544L544 768zM64 704h256c-7-2-13-6-20-13-6-6-11-16-15-30-7-25-9-57-6-94s11-75 22-115c-15-47-39-103-71-170s-51-106-58-118c-9-3-23-9-44-19-21-9-42-23-64-41V704z m283-307c29-72 54-117 75-134s41-29 60-34c-41-6-79-13-116-21-36-8-75-21-116-38 1 1 14 28 39 80s45 101 58 147z m357-461H96c-4 0-8 1-11 2 13 4 29 13 47 28 29 24 67 74 114 152 20 8 37 15 52 20l27 9c29 8 60 15 92 21 32 5 64 10 95 13 29-14 58-25 89-34 31-8 58-13 79-15 9 0 17 1 24 2v-198z m0 311c-12 7-26 13-41 18-15 4-31 6-48 7-25 0-51-2-79-5-15 4-36 18-63 41s-55 73-84 149c8 53 12 95 13 126s1 47 0 48c3 26-2 45-13 56s-24 17-39 17h162l192-192v-265z" horiz-adv-x="768" />
<glyph glyph-name="file-submodule" unicode="&#xf017;" d="M640 384H256v-448h576c35 0 64 29 64 64V320H640v64z m-64-128H320v64h256v-64z m256 320H448v64c0 42-20 64-64 64H64c-35 0-64-29-64-64v-640c0-35 29-64 64-64h128V384c0 35 29 64 64 64h384c35 0 64-29 64-64h192V512c0 35-29 64-64 64z m-448 0H64v64h320v-64z" horiz-adv-x="896" />
<glyph glyph-name="file-symlink-directory" unicode="&#xf0b1;" d="M832 576H448v64c0 42-20 64-64 64H64c-35 0-64-29-64-64v-640c0-35 29-64 64-64h768c35 0 64 29 64 64V512c0 35-29 64-64 64zM64 640h320v-64H64v64z m384-576V192c-63 1-118-14-163-45s-76-80-93-147c1 105 25 184 72 239 47 54 108 81 184 81V448l256-192-256-192z" horiz-adv-x="896" />
<glyph glyph-name="file-symlink-file" unicode="&#xf0b0;" d="M544 768H64C29 768 0 739 0 704v-768c0-35 29-64 64-64h640c35 0 64 29 64 64V544L544 768z m160-832H64V704h448l192-192v-576zM384 544l256-192-256-192V288c-63 1-118-14-163-45s-76-80-93-147c1 105 25 184 72 239 47 54 108 81 184 81V544z" horiz-adv-x="768" />
<glyph glyph-name="file-text" unicode="&#xf011;" d="M384 512H128v64h256v-64zM128 320h448v64H128v-64z m0-128h448v64H128v-64z m0-128h448v64H128v-64z m640 480v-608c0-35-29-64-64-64H64c-35 0-64 29-64 64V704c0 35 29 64 64 64h480l224-224z m-64-32L512 704H64v-768h640V512z" horiz-adv-x="768" />
<glyph glyph-name="file-zip" unicode="&#xf013;" d="M544 768H64C29 768 0 739 0 704v-768c0-35 29-64 64-64h640c35 0 64 29 64 64V544L544 768z m160-832H64V704h192v-64h64v64h192l192-192v-576zM320 576v64h64v-64h-64z m-64 0h64v-64h-64v64z m64-128v64h64v-64h-64z m-64 0h64v-64h-64v64z m64-128v64h64v-64h-64z m-64-82c-38-22-64-63-64-110v-64h256v64c0 71-57 128-128 128v64h-64v-82z m128-46v-64H256v64h128z" horiz-adv-x="768" />
<glyph glyph-name="flame" unicode="&#xf0d2;" d="M323 812c52-139 26-216-33-276-63-67-163-117-232-215-93-131-109-418 226-493-141 74-171 289-19 423-39-130 34-213 124-183 89 30 147-34 145-107-1-50-20-92-72-116 219 38 306 219 306 356 0 182-162 206-80 359-97-8-130-72-121-176 6-69-65-115-119-85-43 26-42 76-4 114 80 79 112 262-120 398l-1 1z" horiz-adv-x="768" />
<glyph glyph-name="fold" unicode="&#xf0cc;" d="M448 256l192-192H512v-192H384V64H256l192 192z m192 384H512V832H384v-192H256l192-192 192 192z m256-128c0 35-29 64-64 64H672l-64-64h192L672 384H224L96 512h192l-64 64H64c-35 0-64-29-64-64l160-160L0 192c0-35 29-64 64-64h160l64 64H96l128 128h448l128-128H608l64-64h160c35 0 64 29 64 64L736 352l160 160z" horiz-adv-x="896" />
<glyph glyph-name="gear" unicode="&#xf02f;" d="M896 271V373l-124 41-29 70 56 118-72 72-116-58-70 29-44 123H395l-40-124-71-29-118 56-72-72 58-116-29-70L0 369v-102l124-41 29-70-56-118 72-72 116 58 70-29 44-123h102l40 124 71 29 118-56 72 72-59 116 30 70 123 44zM448 128c-106 0-192 86-192 192s86 192 192 192 192-86 192-192-86-192-192-192z" horiz-adv-x="896" />
<glyph glyph-name="gift" unicode="&#xf042;" d="M832 576h-88c12 21 21 43 23 58 4 43-7 78-33 103-23 24-52 31-87 31-3 0-5 0-7 0-34-1-71-16-98-37s-47-46-62-77c-15 31-35 56-62 77s-64 37-98 37c-1 0-2 0-2 0-36 0-68-6-92-31-26-25-37-60-33-103 2-15 11-37 23-58h-88c-35 0-64-29-64-64v-192h64v-320c0-35 29-64 64-64h576c35 0 64 29 64 64V320h64V512c0 35-29 64-64 64z m-306 56c11 23 27 43 48 59 19 15 46 25 67 26h6c29 0 42-7 51-16s21-25 19-61c-3-12-16-39-32-64H500l26 56z m-264 69c8 8 20 16 58 16 20 0 46-11 66-26 21-16 37-35 48-59l27-56H275c-16 25-29 52-32 64-2 36 10 52 19 61z m186-701H192V320h256v-320z m0 384H128V512h320v-128z m320-384H512V320h256v-320z m64 384H512V512h320v-128z" horiz-adv-x="896" />
<glyph glyph-name="gist" unicode="&#xf00e;" d="M480 512l160-160-160-160-48 48 112 112-112 112 48 48z m-192 0L128 352l160-160 48 48-112 112 112 112-48 48zM0 0V704c0 35 29 64 64 64h640c35 0 64-29 64-64v-704c0-35-29-64-64-64H64c-35 0-64 29-64 64z m64 0h640V704H64v-704z" horiz-adv-x="768" />
<glyph glyph-name="gist-secret" unicode="&#xf08c;" d="M512 160l64-224H320l64 224-48 96h224l-48-96z m128 288H256l-128-64h640l-128 64z m-64 256l-128-64-128 64-64-192h384l-64 192z m258-496l-194 48 64-128-128-192h206c29 0 55 20 62 48l36 146c9 34-12 69-46 78z m-578 48L62 208c-34-9-55-44-46-78l36-146c7-28 33-48 62-48h206L192 128l64 128z" horiz-adv-x="896" />
<glyph glyph-name="git-branch" unicode="&#xf020;" d="M640 512c0 71-57 128-128 128s-128-57-128-128c0-47 26-88 64-110v-19c-1-33-15-63-40-88s-55-39-88-40c-53-1-95-10-128-29V530c38 22 64 63 64 110 0 71-57 128-128 128S0 711 0 640c0-47 26-88 64-110v-420C26 88 0 47 0 0c0-71 57-128 128-128s128 57 128 128c0 34-13 64-34 87 6 4 31 26 38 30 16 7 36 11 60 11 67 3 125 29 176 80s77 127 80 193h-1c39 23 65 64 65 111zM128 717c42 0 77-35 77-77s-35-77-77-77-77 35-77 77 35 77 77 77z m0-794c-42 0-77 35-77 77s35 77 77 77 77-35 77-77-35-77-77-77z m384 512c-42 0-77 35-77 77s35 77 77 77 77-35 77-77-35-77-77-77z" horiz-adv-x="640" />
<glyph glyph-name="git-commit" unicode="&#xf01f;" d="M695 384c-29 110-128 192-247 192s-218-82-247-192H0v-128h201c29-110 128-192 247-192s218 82 247 192h201V384H695zM448 179c-78 0-141 63-141 141s63 141 141 141 141-63 141-141-63-141-141-141z" horiz-adv-x="896" />
<glyph glyph-name="git-compare" unicode="&#xf0ac;" d="M320 64h-64c-17 1-31 7-44 20s-19 27-20 44V530c38 22 64 63 64 110 0 71-57 128-128 128S0 711 0 640c0-47 26-88 64-110 0-111 0-402 0-402 2-50 22-94 60-132s82-58 132-60c0 0 65 0 64 0v-128l192 192-192 192v-128zM128 717c42 0 77-35 77-77s-35-77-77-77-77 35-77 77 35 77 77 77z m704-607c0 111 0 402 0 402-2 50-22 94-60 132s-82 58-132 60c0 0-65 0-64 0V832L384 640l192-192V576h64c17-1 31-7 44-20s19-27 20-44v-402c-38-22-64-63-64-110 0-71 57-128 128-128s128 57 128 128c0 47-26 88-64 110z m-64-187c-42 0-77 35-77 77s35 77 77 77 77-35 77-77-35-77-77-77z" horiz-adv-x="896" />
<glyph glyph-name="git-merge" unicode="&#xf023;" d="M640 384c-47 0-88-26-111-65v1c-67 1-145 23-200 65-48 37-96 103-121 156 29 23 48 59 48 99 0 71-57 128-128 128S0 711 0 640c0-47 26-88 64-110v-420C26 88 0 47 0 0c0-71 57-128 128-128s128 57 128 128c0 47-26 88-64 110V341c43-45 92-81 147-108s130-40 190-41v1c23-39 64-65 111-65 71 0 128 57 128 128s-57 128-128 128zM205 0c0-42-35-77-77-77s-77 35-77 77 35 77 77 77 77-35 77-77z m-77 563c-42 0-77 35-77 77s35 77 77 77 77-35 77-77-35-77-77-77z m512-384c-42 0-77 35-77 77s35 77 77 77 77-35 77-77-35-77-77-77z" horiz-adv-x="768" />
<glyph glyph-name="git-pull-request" unicode="&#xf009;" d="M704 110c0 111 0 402 0 402-2 50-22 94-60 132s-82 58-132 60c0 0-65 0-64 0V832L256 640l192-192V576h64c17-1 31-7 44-20s19-27 20-44v-402c-38-22-64-63-64-110 0-71 57-128 128-128s128 57 128 128c0 47-26 88-64 110z m-64-187c-42 0-77 35-77 77s35 77 77 77 77-35 77-77-35-77-77-77zM256 640c0 71-57 128-128 128S0 711 0 640c0-47 26-88 64-110 0-99 0-356 0-420-38-22-64-63-64-110 0-71 57-128 128-128s128 57 128 128c0 47-26 88-64 110V530c38 22 64 63 64 110z m-51-640c0-42-35-77-77-77s-77 35-77 77 35 77 77 77 77-35 77-77z m-77 563c-42 0-77 35-77 77s35 77 77 77 77-35 77-77-35-77-77-77z" horiz-adv-x="768" />
<glyph glyph-name="globe" unicode="&#xf0b6;" d="M448 768C201 768 0 567 0 320s201-448 448-448c31 0 60 3 88 9-11 5-13 47-1 70 12 26 52 93 13 115s-28 32-52 58-14 30-16 37c-5 22 23 57 25 60 1 4 1 17 0 21 0 5-17 14-22 15-4 0-7-7-13-8s-32 16-38 21-9 15-17 22c-8 8-9 2-21 7s-51 20-82 31c-31 12-33 30-33 42-1 13-19 30-27 43-9 13-10 30-13 26s16-50 13-52c-3-1-10 13-19 24-9 12 9 6-19 61s9 83 11 112 24-11 12 8 0 57-9 71c-8 14-56-16-56-16 1 14 44 37 74 59s50 4 74-3c25-8 26-6 18 3-8 8 4 11 23 8 18-3 24-26 53-23 30 2 3-6 7-14s-4-7-24-19c-19-13 1-14 35-39s24 16 20 35 25 4 25 4c21-14 17-1 32-5s58-41 58-41c-53-28-20-31-11-38s-18-19-18-19c-11 11-12-1-19-5s-1-14-1-14c-36-6-28-44-27-53 0-9-24-23-30-37-6-13 16-41 4-42-12-2-22 42-84 26-19-5-60-26-38-69 23-44 59 12 71 6s-4-34-1-35 34-1 36-39 49-34 59-35c11 0 45 28 49 29 4 2 24 18 66-6 42-23 63-20 77-30s5-30 18-37 68 2 82-20-56-134-78-146-31-41-54-59-52-41-81-58c-26-15-30-42-42-51 201 45 351 224 351 438 0 247-201 448-448 448z m105-420c-6-2-18-14-50 5-31 19-52 15-55 18 0 0-3 7 11 9 28 3 63-26 71-26s12 8 26 3 3-8-3-9zM406 723c-3 2 2 5 6 9 2 2 1 7 3 9 7 7 39 16 33-2-7-17-37-19-42-16z m79-57c-12 1-37 3-33 9 19 18-6 24-22 24-16 1-22 10-14 12s39-1 45-5c5-4 33-16 35-24 1-8 0-16-11-16z m94 3c-9-6-53 26-61 33-36 31-57 20-64 26s-5 12 7 22 44-4 64-6c19-2 42-17 42-35 1-16 21-32 12-40z" horiz-adv-x="896" />
<glyph glyph-name="graph" unicode="&#xf043;" d="M1024-64v-64H0V832h64v-896h960z m-704 64H192V320h128v-320z m256 0H448V640h128v-640z m256 0H704V448h128v-448z" horiz-adv-x="1024" />
<glyph glyph-name="heart" unicode="&#x2665;" d="M717 576c-33 40-80 61-141 64-62 0-108-27-141-64s-50-59-51-64c-1 5-18 27-51 64s-75 64-141 64c-61-3-108-24-141-64-33-39-50-82-51-128 0-33 6-97 43-171s150-188 341-341c191 153 305 267 342 341s42 139 42 171c-1 46-18 89-51 129z" horiz-adv-x="768" />
<glyph glyph-name="history" unicode="&#xf07e;" d="M512 0H384V448h320v-128H512v-320zM448 768c-140 0-264-65-346-166L0 704v-256h256l-96 96c67 85 171 141 288 141 201 0 365-164 365-365S649-45 448-45 83 119 83 320c0 22 2 43 6 64H5c-3-21-5-42-5-64 0-247 201-448 448-448s448 201 448 448S695 768 448 768z" horiz-adv-x="896" />
<glyph glyph-name="home" unicode="&#xf08d;" d="M1024 256L832 448V704H704v-128L512 768 0 256h128l64-320c0-35 29-64 64-64h512c35 0 64 29 64 64l64 320h128zM768-64H576V192H448v-256H256l-76 404 332 332 332-332-76-404z" horiz-adv-x="1024" />
<glyph glyph-name="horizontal-rule" unicode="&#xf070;" d="M64 384h128v-128h64V640h-64v-192H64V640H0v-384h64V384z m576-128V384h-64v-128h64z m0 192V576h-64v-128h64z m-192 0V576h128v64H384v-384h64V384h128v64H448zM0 0h640V128H0v-128z" horiz-adv-x="640" />
<glyph glyph-name="hubot" unicode="&#xf09d;" d="M192 448c-35 0-64-29-64-64v-128c0-35 29-64 64-64h512c35 0 64 29 64 64V384c0 35-29 64-64 64H192z m512-112l-80-80h-96l-80 80-80-80h-96l-80 80v48h48l80-80 80 80h96l80-80 80 80h48v-48zM320 128h256v-64H320v64z m128 576C201 704 0 518 0 288v-288c0-35 29-64 64-64h768c35 0 64 29 64 64V288c0 230-201 416-448 416z m384-704H64V288c0 198 169 358 384 358s384-160 384-358v-288z" horiz-adv-x="896" />
<glyph glyph-name="inbox" unicode="&#xf0cf;" d="M896 256l-72 457c-5 31-32 55-64 55H136c-32 0-59-24-64-55L0 256v-320c0-35 29-64 64-64h768c35 0 64 29 64 64V256z m-210-35l-28-57c-11-22-33-36-58-36H295c-24 0-46 14-57 35l-28 58c-11 21-33 35-57 35H64l64 448h640l64-448h-88c-25 0-47-14-58-35z" horiz-adv-x="896" />
<glyph glyph-name="info" unicode="&#xf059;" d="M403 468c-12 12-18 27-18 45s6 33 18 45 27 18 45 18 33-6 45-18 18-27 18-45-6-33-18-45-27-19-45-19-33 7-45 19z m109-147c-1 16-7 31-20 44-13 12-27 19-44 20h-64c-17-1-31-8-44-20-13-13-19-28-20-44h64v-192c1-17 7-32 20-44 13-13 27-20 44-20h64c17 0 31 7 44 20 13 12 19 27 20 44h-64V321z m-64 364C247 685 83 522 83 321s164-365 365-365 365 163 365 365-164 364-365 364m0 84c247 0 448-201 448-448S695-127 448-127 0 73 0 321 201 769 448 769z" horiz-adv-x="896" />
<glyph glyph-name="issue-closed" unicode="&#xf028;" d="M448 192h128v-128H448V192z m128 384H448v-320h128V576z m96-96l-64-64 160-160 256 288-64 64-192-224-96 96zM512-45c-201 0-365 164-365 365s164 365 365 365c117 0 221-56 288-141l59 59C777 704 652 768 512 768 265 768 64 567 64 320s201-448 448-448 448 201 448 448l-97-97c-42-154-183-268-351-268z" horiz-adv-x="1024" />
<glyph glyph-name="issue-opened" unicode="&#xf026;" d="M448 685c201 0 365-164 365-365S649-45 448-45 83 119 83 320s164 365 365 365m0 83C201 768 0 567 0 320s201-448 448-448 448 201 448 448S695 768 448 768z m64-192H384v-320h128V576z m0-384H384v-128h128V192z" horiz-adv-x="896" />
<glyph glyph-name="issue-reopened" unicode="&#xf027;" d="M512 256H384V576h128v-320zM384 64h128V192H384v-128z m405 128H640l96-96c-67-85-171-141-288-141-201 0-365 164-365 365 0 22 2 43 6 64H5c-3-21-5-42-5-64 0-247 201-448 448-448 140 0 264 65 346 166l102-102V192H789zM107 448h149l-96 96c67 85 171 141 288 141 201 0 365-164 365-365 0-22-2-43-6-64h84c3 21 5 42 5 64 0 247-201 448-448 448-140 0-264-65-346-166L0 704v-256h107z" horiz-adv-x="896" />
<glyph glyph-name="italic" unicode="&#xf0e4;" d="M180 512h127L192-64H64l116 576z m23 173c0 45 37 83 85 83 36 0 72-24 72-66 0-48-38-83-85-83-37 0-72 24-72 66z" horiz-adv-x="384" />
<glyph glyph-name="jersey" unicode="&#xf019;" d="M224 448l-32-32v-320l32-32h128l32 32V416l-32 32H224z m96-320h-64V384h64v-256z m401 464c-14 88-20 168-17 240H513c0-17-8-31-25-44-16-13-40-19-72-19s-56 6-72 19c-15 13-23 27-23 44H128c3-72-2-152-16-240-13-88-51-136-112-144v-576c1-17 7-31 20-44s27-19 44-20h704c17 1 31 7 44 20s19 27 20 44V448c-61 8-98 56-112 144z m47-720H64V384c57 32 95 80 110 144s20 144 18 240h64c-1-50 10-94 33-132 23-37 65-57 128-60 63 1 105 21 128 60 23 38 32 82 31 132h64c1-91 8-163 21-216 13-52 44-128 107-168v-512zM480 448l-32-32v-320l32-32h128l32 32V416l-32 32H480z m96-320h-64V384h64v-256z" horiz-adv-x="896" />
<glyph glyph-name="key" unicode="&#xf049;" d="M821 693c-48 48-108 73-181 75-72-2-133-27-181-75s-72-108-74-181c0-19 2-38 6-57L0 64v-64l64-64h128l64 64v64h64v64h64v64h128l70 71c19-5 38-7 58-7 73 2 133 27 181 75s73 108 75 181c-2 73-27 133-75 181zM704 488c-49 0-88 39-88 88s39 88 88 88 88-39 88-88-39-88-88-88z" horiz-adv-x="896" />
<glyph glyph-name="keyboard" unicode="&#xf00d;" d="M640 512h-64v64h64v-64z m-448-64h-64v-64h64v64z m320 128h-64v-64h64v64z m-256 0H128v-64h128v64z m512-448h128v64H768v-64zM512 384h64v64h-64v-64zM256 192H128v-64h128v64z m512 384h-64v-64h64v64z m128 0h-64v-64h64v64zM768 256h128V448H768v-192z m256 384v-576c0-35-29-64-64-64H64c-35 0-64 29-64 64V640c0 35 29 64 64 64h896c35 0 64-29 64-64z m-64 0H64v-576h896V640zM384 384h64v64h-64v-64z m0 192h-64v-64h64v64zM256 384h64v64h-64v-64z m64-256h384v64H320v-64z m320 256h64v64h-64v-64z m-448-64h-64v-64h64v64z m320 0v-64h64v64h-64z m-128 0v-64h64v64h-64z m-64 0h-64v-64h64v64z m320-64h64v64h-64v-64z" horiz-adv-x="1024" />
<glyph glyph-name="law" unicode="&#xf0d8;" d="M448 576c-53 0-96 43-96 96s43 96 96 96 96-43 96-96-43-96-96-96z m448-384c0-71-57-128-128-128h-64c-71 0-128 57-128 128l128 256h-64c-35 0-64 29-64 64h-64v-512c27 0 64-29 64-64h64c27 0 64-29 64-64H192c0 35 37 64 64 64h64c0 35 37 64 64 64h2l-2 512h-64c0-35-29-64-64-64h-64l128-256c0-71-57-128-128-128h-64C57 64 0 121 0 192l128 256H64v64h192c0 35 29 64 64 64h256c35 0 64-29 64-64h192v-64h-64l128-256zM160 384L64 192h192l-96 192z m672-192l-96 192-96-192h192z" horiz-adv-x="896" />
<glyph glyph-name="light-bulb" unicode="&#xf000;" d="M352 832C159 832 0 692 0 512c0-59 35-144 64-192 86-144 114-178 128-256v-64h320v64c14 78 42 112 128 256 29 48 64 133 64 192C704 692 545 832 352 832z m233-479c-16-28-30-51-43-71-55-90-80-132-93-207-1-3-1-7-1-11H256c0 4 0 8-1 11-13 75-38 117-93 207-13 20-27 43-43 71-27 45-55 117-55 159C64 653 193 768 352 768c78 0 151-27 206-76 53-48 82-112 82-180 0-42-28-114-55-159zM192-64h320c-15-73-83-128-160-128s-145 55-160 128z" horiz-adv-x="768" />
<glyph glyph-name="link" unicode="&#xf05c;" d="M256 256h64v-64h-64c-96 0-192 108-192 224s99 224 192 224h256c93 0 192-108 192-224 0-90-58-174-128-208v74c37 29 64 81 64 134 0 82-65 160-128 160H256c-63 0-128-78-128-160s64-160 128-160z m576 192h-64v-64h64c64 0 128-78 128-160s-65-160-128-160H576c-63 0-128 78-128 160 0 53 27 105 64 134v74c-70-34-128-118-128-208 0-116 99-224 192-224h256c93 0 192 108 192 224s-96 224-192 224z" horiz-adv-x="1024" />
<glyph glyph-name="link-external" unicode="&#xf07f;" d="M704 192h64v-192c0-35-29-64-64-64H64c-35 0-64 29-64 64V640c0 35 29 64 64 64h192v-64H64v-640h640V192zM384 704l144-144-208-208 96-96 208 208 144-144V704H384z" horiz-adv-x="768" />
<glyph glyph-name="list-ordered" unicode="&#xf062;" d="M768 0c0-38 0-64-38-64H294c-38 0-38 26-38 64s0 64 38 64h436c38 0 38-26 38-64zM294 576h436c38 0 38 26 38 64s0 64-38 64H294c-38 0-38-26-38-64s0-64 38-64z m436-192H294c-38 0-38-26-38-64s0-64 38-64h436c38 0 38 26 38 64s0 64-38 64zM128 768H82C63 756 45 752 16 746v-42h48v-137H10v-55h182v55h-64V768z m16-520c-11 0-29-2-42-4 34 36 73 80 73 121-1 50-36 83-87 83-38 0-62-13-88-41l37-37c12 12 24 24 41 24 18 0 31-10 31-33 0-34-49-77-109-132v-37h192l-6 56h-42z m-5-242v2c28 12 41 30 41 55 0 45-36 71-92 71-31 0-57-12-82-33l35-41c16 13 28 20 44 20 17 0 27-8 27-23 0-17-13-28-55-28v-48c53 0 63-11 63-30 0-16-15-24-37-24-18 0-36 9-52 24L0-92c19-23 49-36 90-36 53 0 98 26 98 74 0 32-20 52-49 60z" horiz-adv-x="768" />
<glyph glyph-name="list-unordered" unicode="&#xf061;" d="M128 0c0-38 0-64-38-64H38c-38 0-38 26-38 64s0 64 38 64h52c38 0 38-26 38-64z m166 576h436c38 0 38 26 38 64s0 64-38 64H294c-38 0-38-26-38-64s0-64 38-64zM90 384H38c-38 0-38-26-38-64s0-64 38-64h52c38 0 38 26 38 64s0 64-38 64z m0 320H38c-38 0-38-26-38-64s0-64 38-64h52c38 0 38 26 38 64s0 64-38 64z m640-320H294c-38 0-38-26-38-64s0-64 38-64h436c38 0 38 26 38 64s0 64-38 64z m0-320H294c-38 0-38-26-38-64s0-64 38-64h436c38 0 38 26 38 64s0 64-38 64z" horiz-adv-x="768" />
<glyph glyph-name="location" unicode="&#xf060;" d="M384 832C172 832 0 672 0 480c0-289 384-672 384-672s384 383 384 672C768 672 596 832 384 832z m0-931C265 31 64 292 64 480 64 639 208 768 384 768c86 0 167-31 228-87 59-55 92-126 92-201 0-188-201-449-320-579z m128 579c0-71-57-128-128-128s-128 57-128 128 57 128 128 128 128-57 128-128z" horiz-adv-x="768" />
<glyph glyph-name="lock" unicode="&#xf06a;" d="M256 0h-64v64h64v-64z m512 384v-448c0-35-29-64-64-64H64c-35 0-64 29-64 64V384c0 35 29 64 64 64h64V576C128 717 243 832 384 832s256-115 256-256v-128h64c35 0 64-29 64-64z m-525 64h282V576c0 78-63 141-141 141s-141-63-141-141v-128z m461-64H128v-448h576V384z m-448-64h-64v-64h64v64z m0-128h-64v-64h64v64z" horiz-adv-x="768" />
<glyph glyph-name="logo-gist" unicode="&#xf0ad;" d="M301 401h157v-257c-35-17-105-22-162-22-164 0-222 141-222 323S132 769 296 769c82 0 132-15 210-47V790C465 811 400 832 296 832 72 832 0 660 0 446s71-386 296-386c105 0 180 17 230 41V465H301v-64z m409-238V572h-67v-402c0-80 37-110 110-110v57c-31 0-43 10-43 45v1z m16 558c0 28-21 50-50 50s-49-22-49-50 21-50 49-50 50 22 50 50z m278-364c-96 8-114 31-114 75 0 49 21 86 120 86 67 0 106-10 145-23v60c-44 19-97 25-144 25-141 0-187-77-187-148 0-69 30-120 175-133 99-8 113-40 113-86 0-47-28-91-132-91-71 0-119 12-149 23v-60c32-13 101-25 149-25 152 0 201 77 201 154 0 82-34 130-176 143h-1z m549 158v55h-155V730l-69-20v-135l-100-28v-31h100v-320c0-98 76-136 160-136 12 0 33 1 44 3v57c-12-2-26-2-39-2-62 0-96 25-96 86V516h155v-1z" horiz-adv-x="1600" />
<glyph glyph-name="logo-github" unicode="&#xf092;" d="M553 500H312c-7 0-12-5-12-11v-118c0-6 5-11 12-11h94v-147s-21-7-80-7c-69 0-165 25-165 237s101 239 195 239c81 0 116-14 139-21 7-2 13 5 13 11l27 114c0 3-1 6-4 9-9 6-65 37-205 37C165 832 0 764 0 435s189-379 348-379c132 0 212 57 212 57 3 1 4 6 4 8V489c0 6-5 11-12 11h1zM1773 804h-136c-6 0-11-5-11-11v-262h-212V793c0 6-5 11-11 11h-136c-6 0-11-5-11-11v-711c0-6 6-11 11-11h136c6 0 11 5 11 11V386h212l-1-304c0-6 5-11 11-11h136c6 0 11 5 11 11V793c0 6-5 11-11 11h1zM716 788c-49 0-88-39-88-88s39-88 88-88c48 0 87 39 87 88s-39 88-87 88z m78-227c0 6-5 11-11 11H647c-6 0-11-6-11-13 0 0 0-395 0-470 0-13 8-17 19-17 0 0 58 0 123 0 13 0 16 6 16 17 0 25 0 471 0 471v1z m1505 10h-134c-7 0-11-5-11-12v-348s-35-25-83-25-62 22-62 70c0 47 0 304 0 304 0 6-5 11-11 11h-137c-6 0-11-5-11-11 0 0 0-186 0-327s79-176 187-176c89 0 161 49 161 49s3-25 5-29c1-3 6-6 10-6h86c7 0 11 5 11 11l1 478c0 6-5 11-12 11z m369 16c-77 0-129-34-129-34V794c0 6-5 11-11 11h-136c-6 0-11-5-11-11l-1-711c0-6 6-11 12-11h95c4 0 7 1 9 5 3 4 6 33 6 33s56-53 161-53c124 0 195 63 195 282s-113 248-190 248z m-53-401c-47 1-78 23-78 23V434s31 19 69 22c49 5 96-10 96-126 0-122-21-146-87-144z m-1429 3c-6 0-21-3-37-3-50 0-67 23-67 53s0 200 0 200h102c6 0 10 5 10 12V560c0 6-5 11-10 11h-102V706c0 5-3 8-9 8H935c-6 0-9-3-9-8v-139s-70-17-74-18c-5-1-8-6-8-11v-87c0-7 5-12 11-12h71s0-92 0-210c0-156 109-172 183-172 34 0 75 11 81 14 4 1 6 6 6 10v96c0 7-5 12-11 12h1z" horiz-adv-x="2880" />
<glyph glyph-name="mail" unicode="&#xf03b;" d="M0 576v-512c0-35 29-64 64-64h768c35 0 64 29 64 64V576c0 35-29 64-64 64H64c-35 0-64-29-64-64z m832 0L448 256 64 576h768zM64 480l256-192L64 96V480z m64-416l224 192 96-96 96 96 224-192H128z m704 32L576 288l256 192v-384z" horiz-adv-x="896" />
<glyph glyph-name="mail-read" unicode="&#xf03c;" d="M384 512H256v64h128v-64z m192-64H256v-64h320v64z m320 31v-543c0-35-29-64-64-64H64c-35 0-64 29-64 64V479c0 21 10 40 27 52l101 72v37c0 35 29 64 64 64h77L448 832l179-128h77c35 0 64-29 64-64v-37l101-72c17-12 27-31 27-52zM192 352l256-160 256 160V640H192v-288zM64-32l288 192L64 352v-384z m704-32L448 128 128-64h640z m64 416L544 160l288-192V352z" horiz-adv-x="896" />
<glyph glyph-name="mail-reply" unicode="&#xf051;" d="M384 672l-384-288 384-288v192c111 0 329-61 384-280 0 291-196 451-384 472v192z" horiz-adv-x="768" />
<glyph glyph-name="mark-github" unicode="&#xf00a;" d="M512 832C229.252 832 0 602.748 0 320c0-226.251 146.688-418.126 350.155-485.813 25.593-4.686 34.937 11.125 34.937 24.626 0 12.188-0.469 52.562-0.718 95.314-128.708-23.46-161.707 31.541-172.469 60.373-5.525 14.809-30.407 60.249-52.398 72.263-17.988 9.828-43.26 33.237-0.917 33.735 40.434 0.476 69.348-37.308 78.471-52.75 45.938-77.749 119.876-55.627 148.999-42.5 4.654 32.999 17.902 55.627 32.501 68.373-113.657 12.939-233.22 56.875-233.22 253.063 0 55.94 19.968 101.561 52.658 137.404-5.22 12.999-22.844 65.095 5.063 135.563 0 0 42.937 13.749 140.811-52.501 40.811 11.406 84.594 17.031 128.124 17.22 43.499-0.188 87.314-5.874 128.188-17.28 97.689 66.311 140.686 52.501 140.686 52.501 28-70.532 10.375-122.564 5.124-135.499 32.811-35.844 52.626-81.468 52.626-137.404 0-196.686-119.751-240-233.813-252.686 18.439-15.876 34.748-47.001 34.748-94.748 0-68.437-0.686-123.627-0.686-140.501 0-13.625 9.312-29.561 35.25-24.562C877.436-97.99800000000005 1024 93.87400000000002 1024 320 1024 602.748 794.748 832 512 832z" horiz-adv-x="1024" />
<glyph glyph-name="markdown" unicode="&#xf0c9;" d="M950.154 640H73.846C33.127 640 0 606.873 0 566.154v-492.308C0 33.125 33.127 0 73.846 0h876.308c40.721 0 73.846 33.125 73.846 73.846V566.154C1024 606.873 990.875 640 950.154 640zM576 128.125L448 128V320l-96-123.077L256 320v-192H128V512h128l96-128 96 128 128 0.125V128.125zM767.091 96.125L608 320h96V512h128v-192h96L767.091 96.125z" horiz-adv-x="1024" />
<glyph glyph-name="megaphone" unicode="&#xf077;" d="M640 768c-11 0-23-3-33-9-92-56-319-220-415-247-88 0-192-43-192-160s104-160 192-160c19-5 41-15 64-26v-294h128V93c86-55 172-117 223-148 10-6 22-9 33-9 33 0 64 27 64 64V704c0 37-31 64-64 64z m0-768c-24 15-57 37-96 64-10 7-21 14-32 22V620c10 7 20 13 30 20 39 26 74 49 98 64v-704z m128 384h256v-64H768v64z m0-128l256-128v-64L768 192v64z m256 384v-64L768 448v64l256 128z" horiz-adv-x="1024" />
<glyph glyph-name="mention" unicode="&#xf0be;" d="M421-128c80 0 161 20 228 60l-27 60c-54-33-121-53-194-53-207 0-361 133-361 366C67 585 274 765 488 765c221 0 334-140 334-333 0-153-86-247-160-247-67 0-87 47-67 140l47 240h-67l-7-46c-26 40-60 53-100 53-140 0-234-153-234-280 0-107 60-167 147-167 54 0 107 34 147 80 7-60 60-93 127-93 107 0 241 107 241 320C896 665 742 832 501 832 234 832 0 619 0 299c0-280 187-427 421-427z m-20 320c-47 0-87 33-87 107 0 93 60 206 154 206 33 0 54-13 80-53l-33-193c-40-47-80-67-114-67z" horiz-adv-x="896" />
<glyph glyph-name="milestone" unicode="&#xf075;" d="M512 704H384V832h128v-128z m256-320H128c-35 0-64 29-64 64V576c0 35 29 64 64 64h640l128-128-128-128zM512 576H384v-128h128V576z m-128-768h128V320H384v-512z" horiz-adv-x="896" />
<glyph glyph-name="mirror" unicode="&#xf024;" d="M992 531L544 832 96 531c-19-12-32-29-32-51v-672l480 256 480-256V480c0 22-13 39-32 51z m-32-627L576 112v80h-64v-80L128-96V480L512 736v-288h64V736l384-256v-576zM384 384h320V512l192-192-192-192V256H384v-128L192 320l192 192v-128z" horiz-adv-x="1024" />
<glyph glyph-name="mortar-board" unicode="&#xf0d7;" d="M501 244l-245 76s0-96 0-160 115-96 256-96 256 32 256 96 0 160 0 160l-245-76c-7-2-15-2-23 0h1z m18 409c-4 1-9 1-13 0l-489-152c-21-7-21-36 0-43l111-35v-113c-19-11-32-32-32-55 0-12 3-23 9-32-5-9-9-20-9-32v-165c0-35 128-35 128 0v165c0 12-3 23-9 32 5 9 9 20 9 32 0 24-13 44-32 55v93l313-98c4-1 9-1 13 0l489 152c21 7 21 36 0 43l-488 153z m-6-205c-35 0-64 14-64 32s29 32 64 32 64-14 64-32-29-32-64-32z" horiz-adv-x="1024" />
<glyph glyph-name="mute" unicode="&#xf080;" d="M512 652v-664c0-43-52-64-82-34L192 192H64c-35 0-64 29-64 64V384c0 35 29 64 64 64h128l238 238c30 30 82 9 82-34z m482-206l-68 68-126-126-126 126-68-68 126-126-126-126 68-68 126 126 126-126 68 68-126 126 126 126z" horiz-adv-x="1024" />
<glyph glyph-name="no-newline" unicode="&#xf09c;" d="M1024 512v-192c0-35-29-64-64-64H768v-128L576 320l192 192v-128h128V512h128zM512 320c0-141-115-256-256-256S0 179 0 320s115 256 256 256 256-115 256-256zM96 214l266 266c-31 20-67 32-106 32-106 0-192-86-192-192 0-39 12-75 32-106z m352 106c0 39-12 75-32 106L150 160c31-20 67-32 106-32 106 0 192 86 192 192z" horiz-adv-x="1024" />
<glyph glyph-name="octoface" unicode="&#xf008;" d="M940.812 554.312c8.25 20.219 35.375 101.75-8.562 211.906 0 0-67.375 21.312-219.875-82.906C648.5 700.875 579.875 703.5 512 703.5c-67.906 0-136.438-2.625-200.5-20.25C159.031 787.531 91.719 766.219 91.719 766.219 47.812 656 74.938 574.531 83.188 554.312 31.5 498.438 0 427.125 0 339.656 0 10.437999999999988 213.25-64 510.844-64 808.562-64 1024 10.437999999999988 1024 339.656 1024 427.125 992.5 498.438 940.812 554.312zM512-1c-211.406 0-382.781 9.875-382.781 214.688 0 48.938 24.062 94.595 65.344 132.312 68.75 62.969 185.281 29.688 317.438 29.688 132.25 0 248.625 33.281 317.438-29.625 41.312-37.78 65.438-83.312 65.438-132.312C894.875 8.875 723.375-1 512-1zM351.156 319.562c-42.469 0-76.906-51.062-76.906-114.188s34.438-114.312 76.906-114.312c42.375 0 76.812 51.188 76.812 114.312S393.531 319.562 351.156 319.562zM672.875 319.562C630.5 319.562 596 268.5 596 205.375s34.5-114.312 76.875-114.312 76.812 51.188 76.812 114.312C749.75 268.5 715.312 319.562 672.875 319.562z" horiz-adv-x="1024" />
<glyph glyph-name="organization" unicode="&#xf037;" d="M304 515c35-41 86-67 144-67s109 26 144 67c22-40 64-67 112-67 71 0 128 57 128 128s-57 128-128 128c-26 0-49-8-69-21C615 768 539 832 448 832S281 768 261 683c-20 13-43 21-69 21-71 0-128-57-128-128s57-128 128-128c48 0 90 27 112 67z m333 97c13 24 38 41 67 41 42 0 77-35 77-77s-35-77-77-77-75 34-76 75c4 12 7 25 9 38zM448 769c71 0 129-58 129-129s-58-129-129-129-129 58-129 129S377 769 448 769zM192 499c-42 0-77 35-77 77s35 77 77 77c29 0 54-17 67-41 2-13 5-26 9-38-1-41-34-75-76-75z m640-51H64c-35 0-64-29-64-64v-192c0-35 29-64 64-64v-128c0-35 29-64 64-64h64c35 0 64 29 64 64v64h64v-192c0-35 29-64 64-64h128c35 0 64 29 64 64V64h64v-64c0-35 29-64 64-64h64c35 0 64 29 64 64V128c35 0 64 29 64 64V384c0 35-29 64-64 64zM192 0h-64V192H64V384h128v-384z m448 128h-64V256h-64v-384H384V256h-64v-128h-64V384h384v-256z m192 64h-64v-192h-64V384h128v-192z" horiz-adv-x="896" />
<glyph glyph-name="package" unicode="&#xf0c4;" d="M0 559v-478c0-29 19-54 48-62l416-111c10-3 22-3 32 0l416 111c29 8 48 33 48 62V559c0 29-19 54-48 62L496 732c-10 2-22 2-32 0L48 621c-29-8-48-33-48-62z m448-582L64 79V512l384-103v-432zM64 576l160 43 416-111-160-43L64 576z m832-497L512-23V409l128 35v-156l128 34V478l128 34v-433zM768 542L352 653l128 34 416-111-128-34z" horiz-adv-x="1024" />
<glyph glyph-name="paintcan" unicode="&#xf0d1;" d="M384 832C171.923 832 0 660.077 0 448v-64c0-35.346 28.654-64 64-64v-320c0-70.692 143.269-128 320-128s320 57.308 320 128V320c35.346 0 64 28.654 64 64v64C768 660.077 596.077 832 384 832zM576 192v-32c0-17.673-14.327-32-32-32s-32 14.327-32 32v32c0 17.673-14.327 32-32 32s-32-14.327-32-32v-160c0-17.673-14.327-32-32-32s-32 14.327-32 32V160c0 17.673-14.327 32-32 32s-32-14.327-32-32v-32c0-35.346-28.654-64-64-64s-64 28.654-64 64v64c-35.346 0-64 28.654-64 64V371.193C186.382 340.108 279.318 320 384 320s197.618 20.108 256 51.193V256C640 220.654 611.346 192 576 192zM384 384c-107.433 0-199.393 26.474-237.372 64 37.979 37.526 129.939 64 237.372 64s199.393-26.474 237.372-64C583.393 410.474 491.433 384 384 384zM384 576c-176.62 0-319.816-57.236-319.996-127.867-0.001 0.001-0.002 0.001-0.003 0.002C64.075 624.804 207.314 768 384 768c176.731 0 320-143.269 320-320C704 518.692 560.731 576 384 576z" horiz-adv-x="768" />
<glyph glyph-name="pencil" unicode="&#xf058;" d="M0 64v-192h192l512 512-192 192L0 64z m192-128H64V64h64v-64h64v-64z m659 595l-83-83-192 192 83 83c25 25 65 25 90 0l102-102c25-25 25-65 0-90z" horiz-adv-x="896" />
<glyph glyph-name="person" unicode="&#xf018;" d="M448 448H64c-35 0-64-29-64-64v-320h128v-192c0-35 29-64 64-64h128c35 0 64 29 64 64V64h128V384c0 35-29 64-64 64z m0-320h-64V256h-64v-384H192V256h-64v-128H64V384h384v-256z m0 512C448 746 362 832 256 832S64 746 64 640s86-192 192-192 192 86 192 192zM256 512c-71 0-128 57-128 128S185 768 256 768s128-57 128-128-57-128-128-128z" horiz-adv-x="512" />
<glyph glyph-name="pin" unicode="&#xf041;" d="M640 755v-51l32-64-288-192H141c-28 0-43-34-22-55l201-201L64-128l320 256 201-201c21-21 55-6 55 22V192l192 288 64-32h51c28 0 43 34 22 55L695 777c-21 21-55 6-55-22z" horiz-adv-x="1024" />
<glyph glyph-name="plug" unicode="&#xf0d4;" d="M960 448v64H704V640H576v-64H448c-66 0-113-52-128-128l-64-64c-106 0-192-86-192-192v-128h64V192c0 71 57 128 128 128l64-64c16-74 63-128 128-128h128v-64h128V192h256v64H704V448h256z" horiz-adv-x="1024" />
<glyph glyph-name="plus" unicode="&#xf05d;" d="M768 256H448v-320H320V256H0V384h320V704h128v-320h320v-128z" horiz-adv-x="768" />
<glyph glyph-name="primitive-dot" unicode="&#xf052;" d="M0 320c0 141 115 256 256 256s256-115 256-256-115-256-256-256S0 179 0 320z" horiz-adv-x="512" />
<glyph glyph-name="primitive-square" unicode="&#xf053;" d="M512 64H0V576h512V64z" horiz-adv-x="512" />
<glyph glyph-name="pulse" unicode="&#xf085;" d="M736 320.062L563.188 486.406 422.406 288 352 729.594 152.438 320.062H0V192h230.406L288 307.188l57.594-345.562L576 288l102.375-96H896V320.062H736z" horiz-adv-x="896" />
<glyph glyph-name="question" unicode="&#xf02c;" d="M384 192h128v-128H384V192z m256 224c0-137-128-160-128-160H384c0 35 29 64 64 64h32c18 0 32 14 32 32v64c0 18-14 32-32 32h-64c-18 0-32-14-32-32v-32H256c0 96 96 192 192 192s192-64 192-160zM448 685c201 0 365-164 365-365S649-45 448-45 83 119 83 320s164 365 365 365m0 83C201 768 0 567 0 320s201-448 448-448 448 201 448 448S695 768 448 768z" horiz-adv-x="896" />
<glyph glyph-name="quote" unicode="&#xf063;" d="M394 629C239 529 163 426 163 254c10 3 19 3 28 3 81 0 160-55 160-154 0-103-66-167-160-167C70-64 0 33 0 208 0 451 112 626 321 747l73-118z m448 0C687 529 611 426 611 254c10 3 19 3 28 3 81 0 160-55 160-154 0-103-66-167-160-167-121 0-191 97-191 272 0 243 112 418 321 539l73-118z" horiz-adv-x="896" />
<glyph glyph-name="radio-tower" unicode="&#xf030;" d="M306.838 441.261c15.868 16.306 15.868 42.731 0 59.037-20.521 21.116-30.643 48.417-30.705 76.124 0.062 27.77 10.183 55.039 30.705 76.186 15.868 16.337 15.868 42.764 0 59.069-7.934 8.184-18.272 12.275-28.706 12.275-10.371 0-20.804-4.029-28.738-12.213-36.266-37.297-54.633-86.433-54.57-135.317-0.062-48.792 18.305-97.927 54.57-135.161C265.262 424.955 290.97 424.955 306.838 441.261zM149.093 798.858c-8.121 8.309-18.68 12.463-29.3 12.463-10.558 0-21.179-4.154-29.237-12.463C30.8 737.509 0.751 656.856 0.813 576.422 0.751 496.081 30.8 415.272 90.494 353.985c16.181-16.618 42.356-16.618 58.537 0 16.118 16.587 16.118 43.513 0 60.067-43.7 44.98-65.44 103.456-65.44 162.368s21.74 117.449 65.44 162.368C165.149 755.439 165.149 782.365 149.093 798.858zM513.031 472.153c57.351 0 103.956 46.574 103.956 103.956 0 57.382-46.605 103.955-103.956 103.955-57.381 0-103.956-46.573-103.956-103.955C409.076 518.727 455.65 472.153 513.031 472.153zM933.539 798.233c-16.181 16.618-42.355 16.618-58.475 0-16.181-16.587-16.181-43.513 0-60.068 43.668-44.918 65.409-103.456 65.409-162.368 0-58.85-21.805-117.387-65.473-162.306-16.117-16.618-16.117-43.575 0.062-60.068 8.059-8.309 18.616-12.463 29.237-12.463 10.558 0 21.178 4.154 29.236 12.463 59.726 61.287 89.774 142.096 89.649 222.437C1023.313 656.138 993.264 736.947 933.539 798.233zM513.281 389.127L513.281 389.127c-26.489-0.062-53.04 6.466-77.091 19.429L235.057-127.59000000000003h95.209l54.819 63.973h255.891l53.977-63.973h95.272L589.124 408.431C565.384 395.655 539.395 389.127 513.281 389.127zM512.656 358.483L577.004 128.29999999999995H449.059L512.656 358.483zM385.086 0.3550000000000182l63.974 63.973h127.944l63.974-63.973H385.086zM717.194 710.958c-15.868-16.306-15.868-42.731 0-59.037 20.491-21.116 30.611-48.511 30.674-76.124-0.062-27.77-10.183-55.102-30.674-76.187-15.868-16.336-15.868-42.763 0-59.068 7.871-8.184 18.242-12.213 28.737-12.213 10.309 0 20.741 4.029 28.675 12.213 36.298 37.234 54.665 86.433 54.54 135.255 0.125 48.792-18.181 97.927-54.54 135.161C758.801 727.264 733.062 727.264 717.194 710.958z" horiz-adv-x="1024" />
<glyph glyph-name="repo" unicode="&#xf001;" d="M256 256h-64v64h64v-64z m0 192h-64v-64h64v64z m0 128h-64v-64h64v64z m0 128h-64v-64h64v64z m512 64v-768c0-35-29-64-64-64H384v-128l-96 96-96-96V-64H64c-35 0-64 29-64 64V768C0 803 29 832 64 832h640c35 0 64-29 64-64z m-64-640H64v-128h128v64h192v-64h320V128z m0 640H128v-576h576V768z" horiz-adv-x="768" />
<glyph glyph-name="repo-clone" unicode="&#xf04c;" d="M960 832H576v-448c0-35 29-64 64-64h64v-64h64v64h192c35 0 64 29 64 64V768c0 35-29 64-64 64zM704 384h-64v64h64v-64z m256 0H768v64h192v-64z m0 128H704V768h256v-256z m-704 0h-64v64h64v-64z m0 128h-64v64h64v-64zM128 768h384V832H64C29 832 0 803 0 768v-768c0-35 29-64 64-64h128v-128l96 96 96-96V-64h320c35 0 64 29 64 64V192H128V768z m576-640v-128H384v64H192v-64H64V128h640zM192 320h64v-64h-64v64z m64 64h-64v64h64v-64z" horiz-adv-x="1024" />
<glyph glyph-name="repo-force-push" unicode="&#xf04a;" d="M640 256H512v-448H384V256H256l144 192H256l192 256 192-256H496l144-192zM704 832H64C29 832 0 803 0 768v-768c0-35 29-64 64-64h256v64H64V128h256v64H128V768h576v-576H576v-64h128v-128H576v-64h128c35 0 64 29 64 64V768c0 35-29 64-64 64z" horiz-adv-x="768" />
<glyph glyph-name="repo-forked" unicode="&#xf002;" d="M512 768c-71 0-128-57-128-128 0-47 26-88 64-110v-82L320 320 192 448v82c38 22 64 63 64 110 0 71-57 128-128 128S0 711 0 640c0-47 26-88 64-110v-114l192-192v-114c-38-22-64-63-64-110 0-71 57-128 128-128s128 57 128 128c0 47-26 88-64 110V224l192 192V530c38 22 64 63 64 110 0 71-57 128-128 128zM128 563c-42 0-77 35-77 77s35 77 77 77 77-35 77-77-35-77-77-77z m192-640c-42 0-77 35-77 77s35 77 77 77 77-35 77-77-35-77-77-77z m192 640c-42 0-77 35-77 77s35 77 77 77 77-35 77-77-35-77-77-77z" horiz-adv-x="640" />
<glyph glyph-name="repo-pull" unicode="&#xf006;" d="M832 320V448H448V576h384V704l192-192-192-192zM256 704h-64v-64h64v64z m448-320h64v-384c0-35-29-64-64-64H384v-128l-96 96-96-96V-64H64c-35 0-64 29-64 64V768C0 803 29 832 64 832h640c35 0 64-29 64-64v-128h-64V768H128v-576h576V384z m0-256H64v-128h128v64h192v-64h320V128zM256 448h-64v-64h64v64z m0 128h-64v-64h64v64z m-64-320h64v64h-64v-64z" horiz-adv-x="1024" />
<glyph glyph-name="repo-push" unicode="&#xf005;" d="M256 640h-64v64h64v-64z m-64-128h64v64h-64v-64z m256 0L256 256h128v-448h128V256h128L448 512zM704 832H64C29 832 0 803 0 768v-768c0-35 29-64 64-64h256v64H64V128h256v64H128V768h577l-1-576H576v-64h128v-128H576v-64h128c35 0 64 29 64 64V768c0 35-29 64-64 64z" horiz-adv-x="768" />
<glyph glyph-name="rocket" unicode="&#xf033;" d="M1024 832s-6-24-19-68c-13-45-35-101-68-170-45 5-81 21-106 46s-40 60-45 105c69 33 125 56 169 69 45 13 69 18 69 18zM779 587c-17 17-30 35-40 56-10 20-17 42-22 65-37-21-74-45-111-72-37-28-73-60-108-95-45-45-85-116-114-157H192L0 192h192l128 128c-22-49-65-191-64-192l64-64c1-1 143 41 192 64L384 0v-192l192 192V192c41 29 112 70 157 114 35 35 67 72 94 109 28 37 52 74 73 110-23 5-45 12-66 22-20 10-38 23-55 40z" horiz-adv-x="1024" />
<glyph glyph-name="rss" unicode="&#xf034;" d="M128 0H0V128c71 0 128-57 128-128zM0 640v-64c318 0 576-258 576-576h64c0 353-287 640-640 640z m0-256v-64c176 0 320-144 320-320h64c0 212-172 384-384 384z" horiz-adv-x="640" />
<glyph glyph-name="ruby" unicode="&#xf047;" d="M832 448L512 128V576h192l128-128z m192 0L512-64 0 448l256 256h512l256-256zM512 32l416 416-192 192H288L96 448l416-416z" horiz-adv-x="1024" />
<glyph glyph-name="search" unicode="&#xf02e;" d="M1005-83L761 162c45 63 71 139 71 222 0 212-172 384-384 384S64 596 64 384s172-384 384-384c83 0 159 26 222 71l245-244c12-13 29-19 45-19s33 6 45 19c25 25 25 65 0 90zM448 83c-166 0-301 135-301 301s135 301 301 301 301-135 301-301-135-301-301-301z" horiz-adv-x="1024" />
<glyph glyph-name="server" unicode="&#xf097;" d="M704 448H64c-35 0-64-29-64-64v-128c0-35 29-64 64-64h640c35 0 64 29 64 64V384c0 35-29 64-64 64zM128 256H64V384h64v-128z m128 0h-64V384h64v-128z m128 0h-64V384h64v-128z m128 0h-64V384h64v-128zM704 768H64C29 768 0 739 0 704v-128c0-35 29-64 64-64h640c35 0 64 29 64 64V704c0 35-29 64-64 64zM128 576H64V704h64v-128z m128 0h-64V704h64v-128z m128 0h-64V704h64v-128z m128 0h-64V704h64v-128z m192 64h-64v64h64v-64z m0-512H64c-35 0-64-29-64-64v-128c0-35 29-64 64-64h640c35 0 64 29 64 64V64c0 35-29 64-64 64zM128-64H64V64h64v-128z m128 0h-64V64h64v-128z m128 0h-64V64h64v-128z m128 0h-64V64h64v-128z" horiz-adv-x="768" />
<glyph glyph-name="settings" unicode="&#xf07c;" d="M192 384h-64V704h64v-320z m-64-448h64V128h-64v-192z m320 0h64V320h-64v-384z m320 0h64V64h-64v-128z m64 768h-64v-384h64V704z m-320 0h-64v-128h64V704zM256 320H64c-35 0-64-29-64-64s29-64 64-64h192c35 0 64 29 64 64s-29 64-64 64z m320 192H384c-35 0-64-29-64-64s29-64 64-64h192c35 0 64 29 64 64s-29 64-64 64z m320-256H704c-35 0-64-29-64-64s29-64 64-64h192c35 0 64 29 64 64s-29 64-64 64z" horiz-adv-x="1024" />
<glyph glyph-name="shield" unicode="&#xf0e1;" d="M448 832L0 704v-385c0-299 340-511 448-511s448 212 448 511V704L448 832zM320 128l73 179c3 15-4 30-16 38-36 23-57 61-57 103 0 70 57 128 127 128 69 0 129-58 129-128 0-42-21-80-57-103-12-8-19-23-16-38l73-179H320z" horiz-adv-x="896" />
<glyph glyph-name="sign-in" unicode="&#xf036;" d="M384 400v-336h256V320h64v-256c0-35-29-64-64-64H384v-192L35-18c-21 11-35 33-35 58V768C0 803 29 832 64 832h576c35 0 64-29 64-64v-192h-64V768H128l256-128v-144l192 144v-128h256v-128H576v-128L384 400z" horiz-adv-x="896" />
<glyph glyph-name="sign-out" unicode="&#xf032;" d="M768 256V384H512V512h256V640l256-192-256-192zM640 64H384V640L128 768h512v-192h64V768c0 35-29 64-64 64H64C29 832 0 803 0 768v-728c0-25 14-47 35-58l349-174V0h256c35 0 64 29 64 64V320h-64v-256z" horiz-adv-x="1024" />
<glyph glyph-name="smiley" unicode="&#xf0e7;" d="M512 832C229 832 0 603 0 320s229-512 512-512 512 229 512 512S795 832 512 832z m308-820c-40-40-87-71-139-93-53-23-110-34-169-34s-116 11-169 34c-52 22-99 53-139 93s-71 87-93 139c-23 53-34 110-34 169s11 116 34 169c22 52 53 99 93 139s87 71 139 93c53 23 110 34 169 34s116-11 169-34c52-22 99-53 139-93s71-87 93-139c23-53 34-110 34-169s-11-116-34-169c-22-52-53-99-93-139zM256 461v38c0 42 34 76 77 76h38c42 0 76-34 76-76v-38c0-43-34-77-76-77h-38c-43 0-77 34-77 77z m320 0v38c0 42 34 76 77 76h38c42 0 76-34 76-76v-38c0-43-34-77-76-77h-38c-43 0-77 34-77 77z m256-269c-46-120-186-192-320-192s-274 72-320 192c-9 25 15 64 42 64h550c26 0 57-39 48-64z" horiz-adv-x="1024" />
<glyph glyph-name="squirrel" unicode="&#xf0b2;" d="M768 768c-141.385 0-256-83.75-256-186.875C512 457.25 544 387 512 192c0 288-177 405.783-256 405.783 3.266 32.17-30.955 42.217-30.955 42.217s-14-7.124-19.354-21.583c-17.231 20.053-36.154 17.54-36.154 17.54l-8.491-37.081c0 0-117.045-40.876-118.635-206.292C56 371 141.311 353.898 201.887 364.882c57.157-2.956 42.991-50.648 30.193-63.446C178.083 247.438 128 320 64 320s-64-64 0-64 64-64 192-64c-198-77 0-256 0-256h-64c-64 0-64-64-64-64s256 0 384 0c192 0 320 64 320 222.182 0 54.34-27.699 114.629-64 162.228C697.057 349.433 782.453 427.566 832 384s192-64 192 128C1024 653.385 909.385 768 768 768zM160 448c-17.674 0-32 14.327-32 32 0 17.674 14.326 32 32 32 17.673 0 32-14.326 32-32C192 462.327 177.673 448 160 448z" horiz-adv-x="1024" />
<glyph glyph-name="star" unicode="&#xf02a;" d="M896 448l-313.5 40.781L448 768 313.469 488.781 0 448l230.469-208.875L171-63.93799999999999l277 148.812 277.062-148.812L665.5 239.125 896 448z" horiz-adv-x="896" />
<glyph glyph-name="stop" unicode="&#xf08f;" d="M640 768H256L0 512v-384l256-256h384l256 256V512L640 768z m192-608L608-64H288L64 160V480l224 224h320l224-224v-320zM384 576h128v-320H384V576z m0-384h128v-128H384V192z" horiz-adv-x="896" />
<glyph glyph-name="sync" unicode="&#xf087;" d="M655.461 358.531c11.875-81.719-13.062-167.781-76.812-230.594-94.188-92.938-239.5-104.375-346.375-34.562l74.875 73L31.96 204.75 70.367-64l84.031 80.5c150.907-111.25 364.938-100.75 502.063 34.562 79.5 78.438 115.75 182.562 111.25 285.312L655.461 358.531zM189.46 511.938c94.156 92.938 239.438 104.438 346.313 34.562l-75-72.969 275.188-38.406L697.586 704l-83.938-80.688C462.711 734.656 248.742 724.031 111.585 588.75 32.085 510.344-4.133 406.219 0.335 303.5l112.25-22.125C100.71 363.125 125.71 449.094 189.46 511.938z" horiz-adv-x="768.051" />
<glyph glyph-name="tag" unicode="&#xf015;" d="M431 657c-30 30-71 47-113 47H160C72 704 0 632 0 544v-158c0-42 17-83 47-113l388-388c25-25 65-25 90 0l294 294c25 25 25 65 0 90L431 657zM88 314c-20 19-30 45-30 72V544c0 56 46 102 102 102h158c27 0 53-10 72-30l393-392-303-303L88 314z m40 262h128v-128H128V576z" horiz-adv-x="896" />
<glyph glyph-name="tasklist" unicode="&#xf0e5;" d="M986 256H486c-38 0-38 26-38 64s0 64 38 64h500c38 0 38-26 38-64s0-64-38-64zM614 576c-38 0-38 26-38 64s0 64 38 64h372c38 0 38-26 38-64s0-64-38-64H614zM0 582l90 83 102-102L454 832l90-90-352-352L0 582z m486-518h500c38 0 38-26 38-64s0-64-38-64H486c-38 0-38 26-38 64s0 64 38 64z" horiz-adv-x="1024" />
<glyph glyph-name="telescope" unicode="&#xf088;" d="M512 256l192-384h-64L512 128v-320h-64V192L320-128h-64l128 320 128 64zM448 832h-64v-64h64V832zM320 640h-64v-64h64v64zM128 768H64v-64h64V768zM40 256c-14-10-18-28-10-43l35-59c8-15 26-20 41-13l89 42-74 128-81-55z m505 345L174 348l79-137 405 194-113 196z m270-82l-94 161c-9 16-30 21-46 11l-77-53 118-205 85 41c17 8 23 28 14 45z" horiz-adv-x="896" />
<glyph glyph-name="terminal" unicode="&#xf0c8;" d="M448 192h256v-64H448v64z m-192-64l192 192-192 192-48-48 144-144-144-144 48-48z m640 512v-640c0-35-29-64-64-64H64c-35 0-64 29-64 64V640c0 35 29 64 64 64h768c35 0 64-29 64-64z m-64 0H64v-640h768V640z" horiz-adv-x="896" />
<glyph glyph-name="text-size" unicode="&#xf0e3;" d="M1150-64h-144l-61 208H685l-61-208H480l-44 149H226l-45-149H42l211 614h160l139-406 185 560h161l252-768zM407 184s-65 231-75 263h-5l-72-263h152z m507 67l-97 347h-4l-96-347h197z" horiz-adv-x="1152" />
<glyph glyph-name="three-bars" unicode="&#xf05e;" d="M730 256H38c-38 0-38 26-38 64s0 64 38 64h692c38 0 38-26 38-64s0-64-38-64z m0 256H38c-38 0-38 26-38 64s0 64 38 64h692c38 0 38-26 38-64s0-64-38-64zM38 128h692c38 0 38-26 38-64s0-64-38-64H38c-38 0-38 26-38 64s0 64 38 64z" horiz-adv-x="768" />
<glyph glyph-name="thumbsdown" unicode="&#xf0db;" d="M1023 331l-62 381C950 800 840 832 768 832H364c-13 0-24-3-34-9l-92-55H128C60 768 0 708 0 640v-256c0-68 60-129 128-128h128c58 0 89-29 153-99 58-64 56-115 40-209-5-32 4-64 27-91 25-30 63-49 100-49 117 0 192 238 192 321l-1 63c1 0 1 0 1 0h129c74 0 125 51 127 126 0 4 1 8-1 13z m-126-76H769c-45 0-66-18-66-62l2-66c0-81-75-256-128-256-32 0-69 32-64 64 16 101 22 178-57 265-65 72-113 120-200 120V704l107 64h405c47 0 125-20 128-64l1-1 64-384c-2-41-24-64-64-64z" horiz-adv-x="1024" />
<glyph glyph-name="thumbsup" unicode="&#xf0da;" d="M896 448H768s0 0-1 0l1 63c0 83-75 321-192 321-37 0-75-19-100-49-23-26-32-58-27-90 16-95 18-146-40-210-64-70-95-99-153-99H128C60 384 0 324 0 256v-256c0-68 60-128 128-128h110l92-55c10-6 21-9 33-9h405c72 0 182 32 192 120l63 381c1 5 1 9 1 13-2 75-54 126-128 126z m0-512c-3-44-81-64-128-64H363l-107 64V320c87 0 135 48 200 120 79 87 73 164 56 264-5 32 32 64 64 64 53 0 128-175 128-256l-1-66c0-44 21-62 65-62h128c40 0 63-23 64-64l-64-384z" horiz-adv-x="1024" />
<glyph glyph-name="tools" unicode="&#xf031;" d="M286.547 366.984c16.843-16.812 81.716-85.279 81.716-85.279l35.968 37.093-56.373 58.248L456.072 491.98c0 0-48.842 47.623-27.468 28.655 20.438 75.903 1.812 160.589-55.842 220.243C315.608 800.064 234.392 819.47 161.425 799.096l123.653-127.715-32.53-125.309-121.06-33.438L7.898 640.3820000000001c-19.718-75.436-0.969-159.339 56.311-218.556C124.302 359.703 210.83 341.453 286.547 366.984zM698.815 242.769L549.694 95.46100000000001l245.932-254.805c20.062-20.812 46.498-31.188 72.872-31.188 26.25 0 52.624 10.375 72.811 31.188 40.249 41.624 40.249 108.997 0 150.62L698.815 242.769zM1023.681 670.162L867.06 832.001 405.387 354.703l56.373-58.248L185.425 10.839000000000055l-63.154-33.749-89.217-145.559 22.719-23.562 140.839 92.247 32.655 65.312 276.336 285.554 56.404-58.248L1023.681 670.162z" horiz-adv-x="1024" />
<glyph glyph-name="trashcan" unicode="&#xf0d0;" d="M640 704H512c0 35-29 64-64 64H256c-35 0-64-29-64-64H64c-35 0-64-29-64-64v-64c0-35 29-64 64-64v-576c0-35 29-64 64-64h448c35 0 64 29 64 64V512c35 0 64 29 64 64v64c0 35-29 64-64 64z m-64-768H128V512h64v-512h64V512h64v-512h64V512h64v-512h64V512h64v-576z m64 640H64v64h576v-64z" horiz-adv-x="768" />
<glyph glyph-name="triangle-down" unicode="&#xf05b;" d="M0 512l384-384 384 384H0z" horiz-adv-x="768" />
<glyph glyph-name="triangle-left" unicode="&#xf044;" d="M384 704L0 320l384-384V704z" horiz-adv-x="384" />
<glyph glyph-name="triangle-right" unicode="&#xf05a;" d="M0-64l384 384L0 704v-768z" horiz-adv-x="384" />
<glyph glyph-name="triangle-up" unicode="&#xf0aa;" d="M768 128L384 512 0 128h768z" horiz-adv-x="768" />
<glyph glyph-name="unfold" unicode="&#xf039;" d="M736 288l160-160c0-35-29-64-64-64H576v64h224L672 256H224L96 128h224v-64H64c-35 0-64 29-64 64l160 160L0 448c0 35 29 64 64 64h256v-64H96l128-128h448l128 128H576v64h256c35 0 64-29 64-64L736 288z m-352 96h128V576h128L448 768 256 576h128v-192z m128-192H384v-192H256l192-192 192 192H512V192z" horiz-adv-x="896" />
<glyph glyph-name="unmute" unicode="&#xf0ba;" d="M704 319c0-70-29-134-75-181l-43 43c35 36 57 84 57 138s-22 103-57 138l43 43c46-46 75-110 75-181zM430 686L192 448H64c-35 0-64-29-64-64v-128c0-35 29-64 64-64h128l238-238c30-30 82-9 82 34V652c0 43-52 64-82 34z m380-5l-43-43c82-82 132-194 132-319 0-124-50-237-132-319l43-43c93 93 150 221 150 362 0 142-57 270-150 362z m-90-90l-44-43c59-59 95-140 95-229s-36-170-95-228l44-43c69 69 112 165 112 271s-43 202-112 272z" horiz-adv-x="1024" />
<glyph glyph-name="unverified" unicode="&#xf0e8;" d="M1003 380l-69 86c-11 14-18 31-20 49l-12 109c-5 45-40 80-85 85l-109 12c-19 2-36 10-50 21l-86 69c-35 28-85 28-120 0l-86-69c-14-11-31-18-49-20l-109-12c-45-5-80-40-85-85l-12-109c-2-19-10-36-21-50l-69-86c-28-35-28-85 0-120l69-86c11-14 18-31 20-49l12-109c5-45 40-80 85-85l109-12c19-2 36-10 50-21l86-69c35-28 85-28 120 0l86 69c14 11 31 18 49 20l109 12c45 5 80 40 85 85l12 109c2 19 10 36 21 50l69 86c28 35 28 85 0 120zM576 96c0-18-14-32-32-32h-64c-17 0-32 14-32 32v64c0 18 15 32 32 32h64c18 0 32-14 32-32v-64z m100 313c-4-11-11-21-19-30-8-10-9-12-21-24-10-11-20-19-33-29-7-6-13-12-18-17s-9-11-12-17-5-12-7-19-2-8-2-16H456c0 14 0 20 2 31 2 12 5 23 9 33 4 9 9 18 16 27 7 8 15 16 26 24 17 12 23 19 31 33s13 24 13 38c0 17-4 29-13 37-8 8-20 12-37 12-6 0-12-1-19-3s-11-6-16-10-9-7-13-13-6-9-6-18H321c0 24 8 36 17 53 10 17 23 32 39 43s35 19 56 24 45 8 70 8c28 0 53-3 75-8 22-6 40-14 56-25 15-11 26-24 35-40 8-16 12-35 12-56 0-14 0-27-5-38z" horiz-adv-x="1024" />
<glyph glyph-name="verified" unicode="&#xf0e6;" d="M1003 380l-69 86c-11 14-18 31-20 49l-12 109c-5 45-40 80-85 85l-109 12c-19 2-36 10-50 21l-86 69c-35 28-85 28-120 0l-86-69c-14-11-31-18-49-20l-109-12c-45-5-80-40-85-85l-12-109c-2-19-10-36-21-50l-69-86c-28-35-28-85 0-120l69-86c11-14 18-31 20-49l12-109c5-45 40-80 85-85l109-12c19-2 36-10 50-21l86-69c35-28 85-28 120 0l86 69c14 11 31 18 49 20l109 12c45 5 80 40 85 85l12 109c2 19 10 36 21 50l69 86c28 35 28 85 0 120zM416 64L192 288l96 96 128-128 320 320 96-99-416-413z" horiz-adv-x="1024" />
<glyph glyph-name="versions" unicode="&#xf064;" d="M832 640H448c-35 0-64-29-64-64v-512c0-35 29-64 64-64h384c35 0 64 29 64 64V576c0 35-29 64-64 64z m-64-512H512V512h256v-384zM256 576h64v-64h-64v-384h64v-64h-64c-35 0-64 29-64 64V512c0 35 29 64 64 64zM64 512h64v-64H64v-256h64v-64H64c-35 0-64 29-64 64V448c0 35 29 64 64 64z" horiz-adv-x="896" />
<glyph glyph-name="watch" unicode="&#xf0e0;" d="M384 320h128v-64H320V512h64v-192z m384 0c0-142-77-266-192-332v-116c0-35-29-64-64-64H256c-35 0-64 29-64 64V-12C77 54 0 178 0 320s77 266 192 332V768c0 35 29 64 64 64h256c35 0 64-29 64-64v-116c115-66 192-190 192-332z m-64 0c0 177-143 320-320 320S64 497 64 320s143-320 320-320 320 143 320 320z" horiz-adv-x="768" />
<glyph glyph-name="x" unicode="&#xf081;" d="M479 320l240-240-95-95-240 240-240-240-95 95 240 240L49 560l95 95 240-240 240 240 95-95-240-240z" horiz-adv-x="768" />
<glyph glyph-name="zap" unicode="&#x26A1;" d="M640 384H384L576 832 0 256h256L64-192 640 384z" horiz-adv-x="640" />
</font>
</defs>
</svg>

После

Ширина:  |  Высота:  |  Размер: 66 KiB

Двоичные данные
sketch2code/Sketch2Code.Web/Content/fonts/octicons.ttf Normal file

Двоичный файл не отображается.

Двоичные данные
sketch2code/Sketch2Code.Web/Content/fonts/octicons.woff Normal file

Двоичный файл не отображается.

Двоичные данные
sketch2code/Sketch2Code.Web/Content/img/Sketech2CODE.gif Normal file

Двоичный файл не отображается.

После

Ширина:  |  Высота:  |  Размер: 333 KiB

Просмотреть файл

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 11"><title>Asset 1</title><g id="dc2db0a2-60a0-4796-99f4-fbf981972062" data-name="Layer 2"><g id="06203691-fbad-40ed-99b4-458adcaffd0b" data-name="Capa 1"><polygon points="54 11 64 5 54 0 54 3 0 3 0 8 54 8 54 11" fill="#2fc1e4"/></g></g></svg>

После

Ширина:  |  Высота:  |  Размер: 299 B

Различия файлов скрыты, потому что одна или несколько строк слишком длинны

После

Ширина:  |  Высота:  |  Размер: 6.1 KiB

Различия файлов скрыты, потому что одна или несколько строк слишком длинны

После

Ширина:  |  Высота:  |  Размер: 6.1 KiB

Двоичные данные
sketch2code/Sketch2Code.Web/Content/img/bottom_right.svg.png Normal file

Двоичный файл не отображается.

После

Ширина:  |  Высота:  |  Размер: 75 KiB

Просмотреть файл

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 222 62"><defs><linearGradient id="a2ebec88-8761-4d28-abf7-bbc45e0be681" y1="31" x2="222" y2="31" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#1ad099"/><stop offset="1" stop-color="#76d449"/></linearGradient></defs><title>Asset 8</title><g id="bcb7988e-74e4-41ae-9a3a-4a7a8ae54503" data-name="Layer 2"><g id="232535d0-a511-4f15-b5b5-48d359a88bf1" data-name="Capa 1"><rect width="222" height="62" rx="30.43" ry="30.43" fill="url(#a2ebec88-8761-4d28-abf7-bbc45e0be681)"/><path d="M58.46,27.43a2.31,2.31,0,0,0-2,1,4.48,4.48,0,0,0-.71,2.69c0,2.38.9,3.58,2.69,3.58a8.42,8.42,0,0,0,2.73-.57V36a7.7,7.7,0,0,1-2.94.55,4.52,4.52,0,0,1-3.58-1.42,6,6,0,0,1-1.23-4.07,6.75,6.75,0,0,1,.6-2.93,4.41,4.41,0,0,1,1.75-1.92,5.14,5.14,0,0,1,2.67-.67,7.26,7.26,0,0,1,3.14.75l-.74,1.85a12.21,12.21,0,0,0-1.2-.5A3.7,3.7,0,0,0,58.46,27.43Z" fill="#fff" stroke="#fff"/><path d="M65.74,32.29V36.4H63.47V25.69h3.12a5.33,5.33,0,0,1,3.23.8,2.83,2.83,0,0,1,1.05,2.41,2.88,2.88,0,0,1-.52,1.68,3.42,3.42,0,0,1-1.47,1.15Q71.29,35.35,72,36.4H69.51L67,32.29Zm0-1.84h.73a2.79,2.79,0,0,0,1.59-.36A1.3,1.3,0,0,0,68.58,29a1.19,1.19,0,0,0-.53-1.09,3.23,3.23,0,0,0-1.62-.32h-.69Z" fill="#fff" stroke="#fff"/><path d="M83.09,31a5.81,5.81,0,0,1-1.32,4.09,5.71,5.71,0,0,1-7.56,0A5.87,5.87,0,0,1,72.9,31a5.76,5.76,0,0,1,1.32-4.09,5.77,5.77,0,0,1,7.57,0A5.84,5.84,0,0,1,83.09,31Zm-7.81,0a4.41,4.41,0,0,0,.68,2.7,2.36,2.36,0,0,0,2,.91c1.82,0,2.72-1.2,2.72-3.61s-.9-3.62-2.7-3.62a2.41,2.41,0,0,0-2,.91A4.46,4.46,0,0,0,75.28,31Z" fill="#fff" stroke="#fff"/><path d="M92.71,29a3.29,3.29,0,0,1-1.08,2.65,4.63,4.63,0,0,1-3.07.91h-1V36.4H85.31V25.69h3.42a4.52,4.52,0,0,1,3,.84A3,3,0,0,1,92.71,29Zm-5.13,1.7h.75a2.54,2.54,0,0,0,1.57-.41,1.48,1.48,0,0,0,.52-1.21A1.5,1.5,0,0,0,90,27.93a2.08,2.08,0,0,0-1.37-.38h-1Z" fill="#fff" stroke="#fff"/><path d="M108.53,36.4h-2.76l-.84-.83a5.43,5.43,0,0,1-3.17,1,4.51,4.51,0,0,1-2.83-.82,2.68,2.68,0,0,1-1.05-2.22,3.2,3.2,0,0,1,.44-1.71,4.33,4.33,0,0,1,1.52-1.33,5.1,5.1,0,0,1-.8-1.2A3.22,3.22,0,0,1,98.79,28a2.18,2.18,0,0,1,.86-1.79,3.58,3.58,0,0,1,2.28-.68,3.49,3.49,0,0,1,2.18.63,2.05,2.05,0,0,1,.82,1.7,2.69,2.69,0,0,1-.51,1.59,5,5,0,0,1-1.63,1.37l2.08,2a9.43,9.43,0,0,0,.9-2.2h2.33a10.76,10.76,0,0,1-.73,1.93,8.72,8.72,0,0,1-1.05,1.66Zm-8.3-3.11a1.24,1.24,0,0,0,.47,1,1.91,1.91,0,0,0,1.22.37,3.16,3.16,0,0,0,1.66-.45l-2.43-2.41a2.83,2.83,0,0,0-.67.67A1.36,1.36,0,0,0,100.23,33.29Zm2.63-5.19a.77.77,0,0,0-.26-.61,1,1,0,0,0-.68-.22,1.17,1.17,0,0,0-.78.23.85.85,0,0,0-.28.67,2.22,2.22,0,0,0,.7,1.42,4.6,4.6,0,0,0,1-.69A1.1,1.1,0,0,0,102.86,28.1Z" fill="#fff" stroke="#fff"/><path d="M122.49,25.69v6.93A4,4,0,0,1,122,34.7a3.49,3.49,0,0,1-1.54,1.37,5.45,5.45,0,0,1-2.37.48,4.57,4.57,0,0,1-3.21-1.06,3.77,3.77,0,0,1-1.14-2.9v-6.9H116v6.56a2.74,2.74,0,0,0,.5,1.81,2.05,2.05,0,0,0,1.65.58,2,2,0,0,0,1.61-.58,2.74,2.74,0,0,0,.51-1.83V25.69Z" fill="#fff" stroke="#fff"/><path d="M132.51,29a3.29,3.29,0,0,1-1.08,2.65,4.63,4.63,0,0,1-3.07.91h-1V36.4h-2.27V25.69h3.42a4.52,4.52,0,0,1,3,.84A3,3,0,0,1,132.51,29Zm-5.13,1.7h.75a2.54,2.54,0,0,0,1.57-.41,1.48,1.48,0,0,0,.52-1.21,1.5,1.5,0,0,0-.44-1.18,2.08,2.08,0,0,0-1.37-.38h-1Z" fill="#fff" stroke="#fff"/><path d="M134.53,36.4V25.69h2.27v8.83h4.34V36.4Z" fill="#fff" stroke="#fff"/><path d="M152.72,31a5.81,5.81,0,0,1-1.32,4.09,5.7,5.7,0,0,1-7.55,0,5.82,5.82,0,0,1-1.32-4.1,5.76,5.76,0,0,1,1.32-4.09,5.77,5.77,0,0,1,7.57,0A5.84,5.84,0,0,1,152.72,31Zm-7.81,0a4.41,4.41,0,0,0,.68,2.7,2.37,2.37,0,0,0,2,.91q2.72,0,2.71-3.61t-2.7-3.62a2.42,2.42,0,0,0-2,.91A4.46,4.46,0,0,0,144.91,31Z" fill="#fff" stroke="#fff"/><path d="M161.5,36.4l-.78-2.55h-3.9L156,36.4h-2.45l3.78-10.75h2.78l3.79,10.75ZM160.18,32c-.72-2.31-1.12-3.62-1.21-3.92s-.16-.54-.2-.72c-.16.63-.62,2.17-1.38,4.64Z" fill="#fff" stroke="#fff"/><path d="M174.18,30.94A5.27,5.27,0,0,1,172.67,35a6.12,6.12,0,0,1-4.35,1.41h-3V25.69h3.36a5.61,5.61,0,0,1,4.07,1.39A5.07,5.07,0,0,1,174.18,30.94Zm-2.36.06q0-3.45-3-3.45h-1.21v7h1C170.72,34.52,171.82,33.35,171.82,31Z" fill="#fff" stroke="#fff"/></g></g></svg>

После

Ширина:  |  Высота:  |  Размер: 4.0 KiB

Двоичные данные
sketch2code/Sketch2Code.Web/Content/img/button_download.png Normal file

Двоичный файл не отображается.

После

Ширина:  |  Высота:  |  Размер: 17 KiB

Различия файлов скрыты, потому что одна или несколько строк слишком длинны

После

Ширина:  |  Высота:  |  Размер: 4.9 KiB

Двоичные данные
sketch2code/Sketch2Code.Web/Content/img/button_letMagic.png Normal file

Двоичный файл не отображается.

После

Ширина:  |  Высота:  |  Размер: 6.0 KiB

Просмотреть файл

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 324 73"><defs><style>.cls-1{fill:url(#Degradado_sin_nombre_38);}.cls-2{fill:#fff;}</style><linearGradient id="Degradado_sin_nombre_38" y1="36.5" x2="324" y2="36.5" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#ff5051"/><stop offset="1" stop-color="#ff8d48"/></linearGradient></defs><title>Asset 7</title><g id="Layer_2" data-name="Layer 2"><g id="Capa_1" data-name="Capa 1"><rect class="cls-1" width="324" height="73" rx="36.5" ry="36.5"/><path class="cls-2" d="M56.43,45.61V32.17h3.63V42.68h5.18v2.93Z"/><path class="cls-2" d="M75.76,45.61h-8V32.17h8v2.91H71.41V37.2h4v2.91h-4v2.54h4.35Z"/><path class="cls-2" d="M84.42,45.61H80.79V35.14H77.5v-3H87.7v3H84.42Z"/><path class="cls-2" d="M101.2,45.61H97.57V35.14H94.28v-3h10.19v3H101.2Z"/><path class="cls-2" d="M118.3,45.61h-3.65V40.13h-4.22v5.48h-3.66V32.17h3.66v5h4.22v-5h3.65Z"/><path class="cls-2" d="M129.57,45.61h-8V32.17h8v2.91h-4.35V37.2h4v2.91h-4v2.54h4.35Z"/><path class="cls-2" d="M143.43,45.61l-2.75-9.68h-.08c.12,1.65.19,2.93.19,3.84v5.84h-3.22V32.17h4.84l2.8,9.54h.08L148,32.17h4.84V45.61h-3.33V39.72c0-.31,0-.65,0-1s.05-1.29.12-2.75h-.08l-2.71,9.66Z"/><path class="cls-2" d="M164.41,45.61l-.66-2.52h-4.37l-.68,2.52h-4l4.38-13.5h4.85l4.44,13.5ZM163,40.11l-.58-2.2c-.13-.5-.3-1.13-.49-1.91s-.32-1.34-.38-1.67c-.06.31-.16.82-.33,1.54s-.52,2.13-1.08,4.24Z"/><path class="cls-2" d="M175.61,37.74h5.81V45a16,16,0,0,1-5.2.81A6.28,6.28,0,0,1,171.41,44a7.21,7.21,0,0,1-1.69-5.14,6.76,6.76,0,0,1,1.86-5.07,7.15,7.15,0,0,1,5.2-1.81,11.49,11.49,0,0,1,2.4.24,9.86,9.86,0,0,1,2,.61L180,35.67A7.08,7.08,0,0,0,176.8,35a3,3,0,0,0-2.46,1,4.46,4.46,0,0,0-.87,2.95,4.51,4.51,0,0,0,.79,2.88,2.71,2.71,0,0,0,2.26,1,6.45,6.45,0,0,0,1.5-.16V40.54h-2.41Z"/><path class="cls-2" d="M184.54,45.61V32.17h3.65V45.61Z"/><path class="cls-2" d="M197.46,35a2.33,2.33,0,0,0-2,1.06,5.1,5.1,0,0,0-.73,2.93q0,3.89,2.95,3.89a6.24,6.24,0,0,0,1.73-.25q.84-.26,1.68-.6v3.07a9.24,9.24,0,0,1-3.8.75A6,6,0,0,1,192.6,44a7.3,7.3,0,0,1-1.62-5.1,8.16,8.16,0,0,1,.78-3.67A5.68,5.68,0,0,1,194,32.82,7,7,0,0,1,197.5,32a9.56,9.56,0,0,1,4.16,1l-1.11,2.86a13.16,13.16,0,0,0-1.49-.59A5.2,5.2,0,0,0,197.46,35Z"/><path class="cls-2" d="M209.34,32.17H214a8,8,0,0,1,4.07.81,2.75,2.75,0,0,1,1.33,2.53,3.21,3.21,0,0,1-.58,1.94,2.6,2.6,0,0,1-1.52,1v.09a3.14,3.14,0,0,1,1.81,1.1,3.37,3.37,0,0,1,.56,2,3.44,3.44,0,0,1-1.37,2.88,6.05,6.05,0,0,1-3.75,1h-5.24ZM213,37.33h1.09a1.94,1.94,0,0,0,1.21-.33,1.1,1.1,0,0,0,.43-1c0-.76-.57-1.13-1.71-1.13h-1ZM213,40v2.83h1.28c1.13,0,1.7-.48,1.7-1.44a1.22,1.22,0,0,0-.46-1,2.08,2.08,0,0,0-1.32-.36Z"/><path class="cls-2" d="M230.4,45.61h-8V32.17h8v2.91h-4.35V37.2h4v2.91h-4v2.54h4.35Z"/><path class="cls-2" d="M238.53,37.74h5.8V45a15.87,15.87,0,0,1-5.19.81A6.25,6.25,0,0,1,234.33,44a7.21,7.21,0,0,1-1.7-5.14,6.76,6.76,0,0,1,1.86-5.07A7.19,7.19,0,0,1,239.7,32a11.46,11.46,0,0,1,2.39.24,9.76,9.76,0,0,1,2,.61l-1.15,2.85a7.08,7.08,0,0,0-3.19-.72,3,3,0,0,0-2.46,1,4.46,4.46,0,0,0-.87,2.95,4.58,4.58,0,0,0,.78,2.88,2.73,2.73,0,0,0,2.27,1,6.3,6.3,0,0,0,1.49-.16V40.54h-2.4Z"/><path class="cls-2" d="M247.45,45.61V32.17h3.65V45.61Z"/><path class="cls-2" d="M267.19,45.61h-4.76l-4.91-9.47h-.09c.12,1.49.18,2.63.18,3.41v6.06h-3.22V32.17h4.74l4.9,9.34h.05c-.08-1.35-.13-2.44-.13-3.26V32.17h3.24Z"/></g></g></svg>

После

Ширина:  |  Высота:  |  Размер: 3.3 KiB

Двоичные данные
sketch2code/Sketch2Code.Web/Content/img/button_picture.png Normal file

Двоичный файл не отображается.

После

Ширина:  |  Высота:  |  Размер: 14 KiB

Просмотреть файл

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 222 62"><defs><style>.cls-1{fill:url(#Degradado_sin_nombre_33);}.cls-2{fill:#fff;}.cls-3{fill:#b22a5f;}</style><linearGradient id="Degradado_sin_nombre_33" y1="31" x2="222" y2="31" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#e94c88"/><stop offset="1" stop-color="#f27da9"/></linearGradient></defs><title>Asset 8</title><g id="Layer_2" data-name="Layer 2"><g id="Capa_1" data-name="Capa 1"><rect class="cls-1" width="222" height="62" rx="30.43" ry="30.43"/><path class="cls-2" d="M63.94,38.74H60.85v-8.9H58.06V27.32h8.66v2.52H63.94Z"/><path class="cls-2" d="M75.68,38.74l-.56-2.14H71.41l-.58,2.14H67.44l3.73-11.47h4.11l3.78,11.47Zm-1.2-4.67L74,32.19c-.12-.41-.26-.95-.42-1.61s-.27-1.14-.33-1.43c0,.27-.14.71-.27,1.32s-.45,1.81-.92,3.6Z"/><path class="cls-2" d="M90.37,38.74H86.88l-2.25-4.37-.92.55v3.82h-3.1V27.32h3.1v5a13.49,13.49,0,0,1,1-1.46l2.4-3.5h3.37l-3.6,5.12Z"/><path class="cls-2" d="M98.7,38.74H91.92V27.32H98.7v2.47H95v1.8h3.42v2.48H95v2.15H98.7Z"/><path class="cls-2" d="M112.51,38.74,112,36.6h-3.72l-.57,2.14h-3.39L108,27.27h4.12l3.77,11.47Zm-1.2-4.67-.5-1.88c-.11-.41-.25-.95-.41-1.61s-.28-1.14-.33-1.43c0,.27-.14.71-.28,1.32s-.44,1.81-.91,3.6Z"/><path class="cls-2" d="M130.2,31a3.81,3.81,0,0,1-1.13,3,4.56,4.56,0,0,1-3.2,1H125v3.79h-3.09V27.32h4a4.85,4.85,0,0,1,3.25.94A3.39,3.39,0,0,1,130.2,31ZM125,32.44h.56a1.51,1.51,0,0,0,1.11-.4,1.41,1.41,0,0,0,.41-1.07c0-.77-.43-1.16-1.28-1.16H125Z"/><path class="cls-2" d="M132.34,38.74V27.32h3.1V38.74Z"/><path class="cls-2" d="M143.32,29.69a2,2,0,0,0-1.72.9,4.37,4.37,0,0,0-.62,2.49c0,2.19.84,3.29,2.51,3.29a5.12,5.12,0,0,0,1.47-.21,14.46,14.46,0,0,0,1.43-.51v2.61a7.76,7.76,0,0,1-3.23.64,5.12,5.12,0,0,1-4-1.5,6.2,6.2,0,0,1-1.38-4.34,6.89,6.89,0,0,1,.67-3.12,4.79,4.79,0,0,1,1.92-2.06,5.84,5.84,0,0,1,2.95-.73,8.11,8.11,0,0,1,3.54.81l-.95,2.43a9.42,9.42,0,0,0-1.26-.5A4.3,4.3,0,0,0,143.32,29.69Z"/><path class="cls-2" d="M154,38.74h-3.09v-8.9H148.1V27.32h8.66v2.52H154Z"/><path class="cls-2" d="M168.42,27.32v6.87a4.61,4.61,0,0,1-1.27,3.48,5.06,5.06,0,0,1-3.66,1.23,5,5,0,0,1-3.59-1.2,4.51,4.51,0,0,1-1.25-3.44V27.32h3.1V34a2.75,2.75,0,0,0,.45,1.76,1.65,1.65,0,0,0,1.34.55,1.62,1.62,0,0,0,1.37-.55,2.92,2.92,0,0,0,.42-1.77V27.32Z"/><path class="cls-2" d="M174.22,34.58v4.16h-3.08V27.32h3.74c3.1,0,4.66,1.12,4.66,3.37a3.37,3.37,0,0,1-1.94,3.07l3.33,5h-3.5L175,34.58Zm0-2.32h.58c1.08,0,1.62-.47,1.62-1.43,0-.78-.53-1.18-1.59-1.18h-.61Z"/><path class="cls-2" d="M189.07,38.74h-6.78V27.32h6.78v2.47h-3.7v1.8h3.42v2.48h-3.42v2.15h3.7Z"/><circle class="cls-3" cx="24.85" cy="31.14" r="1.28"/><path class="cls-3" d="M36.42,28.57A5.57,5.57,0,1,0,42,34.13,5.58,5.58,0,0,0,36.42,28.57Zm0,9.42a3.86,3.86,0,1,1,3.85-3.86A3.86,3.86,0,0,1,36.42,38Z"/><path class="cls-3" d="M44.08,26.43H42.23l-1-1.73a5.6,5.6,0,0,0-1.74-1.63L39.37,23H33.72l-.1.07a5.71,5.71,0,0,0-1.73,1.6l-1.65,1.76h-3V26a1.77,1.77,0,0,0-1.55-1.74h-.86A1.93,1.93,0,0,0,23.19,26l0,.47A2.27,2.27,0,0,0,21,29V40.18c0,1.57.94,2.46,2.65,2.52H44.06c1.7-.06,2.64-1,2.64-2.52V28.57C46.7,27.09,45.89,26.43,44.08,26.43ZM24.85,33.28A2.14,2.14,0,1,1,27,31.14,2.14,2.14,0,0,1,24.85,33.28Zm11.57,7.28a6.43,6.43,0,1,1,6.42-6.43A6.44,6.44,0,0,1,36.42,40.56Z"/></g></g></svg>

После

Ширина:  |  Высота:  |  Размер: 3.2 KiB

Просмотреть файл

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 222 62"><defs><linearGradient id="e39a3964-a29c-4489-9f51-06ece040d7b4" y1="31" x2="222" y2="31" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#1ad099"/><stop offset="1" stop-color="#76d449"/></linearGradient></defs><title>Asset 2</title><g id="fc0f9239-ca46-4468-b44f-4fd5fd4fb5c4" data-name="Layer 2"><g id="e7c83734-40d1-4f57-a7a0-5bef939cd1d4" data-name="Capa 1"><rect width="222" height="62" rx="30.43" ry="30.43" fill="url(#e39a3964-a29c-4489-9f51-06ece040d7b4)"/><path d="M85.33,32.29V36.4H83.06V25.69h3.12a5.33,5.33,0,0,1,3.23.8,2.83,2.83,0,0,1,1,2.41,2.88,2.88,0,0,1-.52,1.68,3.42,3.42,0,0,1-1.47,1.15q2.41,3.61,3.15,4.67H89.1l-2.56-4.11Zm0-1.84h.73a2.79,2.79,0,0,0,1.59-.36A1.3,1.3,0,0,0,88.17,29a1.19,1.19,0,0,0-.53-1.09A3.23,3.23,0,0,0,86,27.55h-.69Z" fill="#fff" stroke="#fff"/><path d="M99.13,36.4H93V25.69h6.17v1.86h-3.9V29.9h3.63v1.86H95.23v2.76h3.9Z" fill="#fff" stroke="#fff"/><path d="M107.68,33.43a2.76,2.76,0,0,1-1,2.28,4.51,4.51,0,0,1-2.9.84,6.83,6.83,0,0,1-3-.65V33.79a12.89,12.89,0,0,0,1.84.68,5.1,5.1,0,0,0,1.37.2,2,2,0,0,0,1.15-.28,1,1,0,0,0,.4-.85.91.91,0,0,0-.18-.56,2,2,0,0,0-.51-.48,13.68,13.68,0,0,0-1.39-.72,6.12,6.12,0,0,1-1.47-.89,3.29,3.29,0,0,1-.79-1,2.86,2.86,0,0,1-.29-1.32,2.77,2.77,0,0,1,1-2.23,4,4,0,0,1,2.66-.81,6,6,0,0,1,1.6.2,10.67,10.67,0,0,1,1.58.55l-.73,1.77a9.32,9.32,0,0,0-1.42-.49,4.2,4.2,0,0,0-1.1-.14,1.46,1.46,0,0,0-1,.3,1,1,0,0,0-.34.78.93.93,0,0,0,.14.53,1.64,1.64,0,0,0,.44.43,12.78,12.78,0,0,0,1.44.75,5.77,5.77,0,0,1,2.06,1.44A2.81,2.81,0,0,1,107.68,33.43Z" fill="#fff" stroke="#fff"/><path d="M113.76,36.4h-2.27V27.58h-2.91V25.69h8.08v1.89h-2.9Z" fill="#fff" stroke="#fff"/><path d="M124.87,36.4l-.78-2.55h-3.9l-.78,2.55H117l3.78-10.75h2.78l3.79,10.75ZM123.55,32c-.72-2.31-1.12-3.62-1.21-3.92s-.16-.54-.2-.72c-.16.63-.62,2.17-1.38,4.64Z" fill="#fff" stroke="#fff"/><path d="M130.93,32.29V36.4h-2.27V25.69h3.12a5.33,5.33,0,0,1,3.23.8,2.83,2.83,0,0,1,1.05,2.41,2.88,2.88,0,0,1-.52,1.68,3.42,3.42,0,0,1-1.47,1.15q2.42,3.61,3.14,4.67H134.7l-2.56-4.11Zm0-1.84h.73a2.79,2.79,0,0,0,1.59-.36,1.3,1.3,0,0,0,.52-1.13,1.19,1.19,0,0,0-.53-1.09,3.23,3.23,0,0,0-1.62-.32h-.69Z" fill="#fff" stroke="#fff"/><path d="M142.69,36.4h-2.27V27.58h-2.9V25.69h8.08v1.89h-2.91Z" fill="#fff" stroke="#fff"/></g></g></svg>

После

Ширина:  |  Высота:  |  Размер: 2.3 KiB

Просмотреть файл

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 222 62"><defs><linearGradient id="2b5b0a31-c7ff-4c2c-8925-033267647364" y1="31" x2="222" y2="31" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#1ad099"/><stop offset="1" stop-color="#76d449"/></linearGradient></defs><title>Asset 9</title><g id="04dbc28c-0c5d-4bce-9128-66f24596f571" data-name="Layer 2"><g id="72a0f7b8-4198-4dba-8971-b7bafb97be32" data-name="Capa 1"><rect width="222" height="62" rx="30.43" ry="30.43" fill="url(#2b5b0a31-c7ff-4c2c-8925-033267647364)"/><path d="M47.1,36.4H44.83V27.58H41.92V25.69H50v1.89H47.1Z" fill="#fff" stroke="#fff"/><path d="M58.21,36.4l-.78-2.55h-3.9l-.78,2.55H50.31l3.77-10.75h2.78l3.8,10.75ZM56.89,32c-.72-2.31-1.12-3.62-1.21-3.92s-.16-.54-.2-.72c-.16.63-.62,2.17-1.38,4.64Z" fill="#fff" stroke="#fff"/><path d="M70.62,36.4H68l-2.81-4.51-1,.69V36.4H62V25.69h2.27v4.9l.9-1.26,2.9-3.64h2.52l-3.74,4.74Z" fill="#fff" stroke="#fff"/><path d="M78.13,36.4H72V25.69h6.17v1.86h-3.9V29.9h3.63v1.86H74.23v2.76h3.9Z" fill="#fff" stroke="#fff"/><path d="M90.58,33.43a2.78,2.78,0,0,1-1,2.28,4.54,4.54,0,0,1-2.91.84,6.82,6.82,0,0,1-3-.65V33.79a12.06,12.06,0,0,0,1.84.68,5,5,0,0,0,1.37.2A2,2,0,0,0,88,34.39a1,1,0,0,0,.39-.85,1,1,0,0,0-.17-.56,1.88,1.88,0,0,0-.52-.48,13.68,13.68,0,0,0-1.39-.72,6.55,6.55,0,0,1-1.47-.89,3.11,3.11,0,0,1-.78-1,2.74,2.74,0,0,1-.3-1.32,2.78,2.78,0,0,1,1-2.23,4,4,0,0,1,2.66-.81,5.87,5.87,0,0,1,1.59.2,10.39,10.39,0,0,1,1.59.55l-.73,1.77a9.7,9.7,0,0,0-1.42-.49,4.2,4.2,0,0,0-1.1-.14,1.46,1.46,0,0,0-1,.3,1,1,0,0,0-.35.78,1,1,0,0,0,.14.53,1.7,1.7,0,0,0,.45.43,12.78,12.78,0,0,0,1.44.75,5.71,5.71,0,0,1,2,1.44A2.82,2.82,0,0,1,90.58,33.43Z" fill="#fff" stroke="#fff"/><path d="M97.07,27.43a2.32,2.32,0,0,0-2,1,4.55,4.55,0,0,0-.7,2.69c0,2.38.9,3.58,2.69,3.58a8.42,8.42,0,0,0,2.73-.57V36a7.7,7.7,0,0,1-2.94.55,4.52,4.52,0,0,1-3.58-1.42A6,6,0,0,1,92,31.06a6.75,6.75,0,0,1,.61-2.93,4.41,4.41,0,0,1,1.75-1.92,5.14,5.14,0,0,1,2.67-.67,7.3,7.3,0,0,1,3.14.75l-.74,1.85a11.43,11.43,0,0,0-1.21-.5A3.6,3.6,0,0,0,97.07,27.43Z" fill="#fff" stroke="#fff"/><path d="M104.35,32.29V36.4h-2.27V25.69h3.12a5.33,5.33,0,0,1,3.23.8,2.83,2.83,0,0,1,1,2.41,2.88,2.88,0,0,1-.52,1.68,3.42,3.42,0,0,1-1.47,1.15q2.42,3.61,3.14,4.67h-2.51l-2.56-4.11Zm0-1.84h.73a2.79,2.79,0,0,0,1.59-.36,1.3,1.3,0,0,0,.52-1.13,1.19,1.19,0,0,0-.53-1.09,3.23,3.23,0,0,0-1.62-.32h-.69Z" fill="#fff" stroke="#fff"/><path d="M118.15,36.4H112V25.69h6.17v1.86h-3.9V29.9h3.63v1.86h-3.63v2.76h3.9Z" fill="#fff" stroke="#fff"/><path d="M126.55,36.4h-6.17V25.69h6.17v1.86h-3.9V29.9h3.63v1.86h-3.63v2.76h3.9Z" fill="#fff" stroke="#fff"/><path d="M138.28,36.4H135.4l-4.66-8.1h-.07c.1,1.43.14,2.45.14,3.06v5h-2V25.69h2.87l4.65,8h0c-.07-1.39-.11-2.37-.11-2.95V25.69h2Z" fill="#fff" stroke="#fff"/><path d="M147.3,33.43a2.78,2.78,0,0,1-1,2.28,4.54,4.54,0,0,1-2.91.84,6.82,6.82,0,0,1-3-.65V33.79a12.4,12.4,0,0,0,1.83.68,5.11,5.11,0,0,0,1.38.2,1.92,1.92,0,0,0,1.14-.28A1.07,1.07,0,0,0,144.9,33a1.88,1.88,0,0,0-.52-.48,13.68,13.68,0,0,0-1.39-.72,6.55,6.55,0,0,1-1.47-.89,3.11,3.11,0,0,1-.78-1,3.05,3.05,0,0,1,.67-3.55,4,4,0,0,1,2.66-.81,5.87,5.87,0,0,1,1.59.2,10.39,10.39,0,0,1,1.59.55l-.73,1.77a10.12,10.12,0,0,0-1.42-.49,4.26,4.26,0,0,0-1.1-.14,1.46,1.46,0,0,0-1,.3,1,1,0,0,0-.35.78,1,1,0,0,0,.14.53,1.56,1.56,0,0,0,.45.43,13.27,13.27,0,0,0,1.43.75,5.67,5.67,0,0,1,2.06,1.44A2.82,2.82,0,0,1,147.3,33.43Z" fill="#fff" stroke="#fff"/><path d="M158,36.4h-2.26V31.78h-4.24V36.4h-2.27V25.69h2.27v4.2h4.24v-4.2H158Z" fill="#fff" stroke="#fff"/><path d="M170.44,31a5.81,5.81,0,0,1-1.32,4.09,5.71,5.71,0,0,1-7.56,0,5.82,5.82,0,0,1-1.32-4.1,5.76,5.76,0,0,1,1.32-4.09,5.77,5.77,0,0,1,7.57,0A5.84,5.84,0,0,1,170.44,31Zm-7.82,0a4.47,4.47,0,0,0,.68,2.7,2.38,2.38,0,0,0,2,.91q2.72,0,2.72-3.61c0-2.41-.91-3.62-2.71-3.62a2.42,2.42,0,0,0-2,.91A4.46,4.46,0,0,0,162.62,31Z" fill="#fff" stroke="#fff"/><path d="M176.79,36.4h-2.27V27.58h-2.91V25.69h8.08v1.89h-2.9Z" fill="#fff" stroke="#fff"/></g></g></svg>

После

Ширина:  |  Высота:  |  Размер: 3.9 KiB

Просмотреть файл

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 222 62"><defs><linearGradient id="675ad169-c378-465d-bffa-291feb2f66cb" y1="31" x2="222" y2="31" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#1ad099"/><stop offset="1" stop-color="#76d449"/></linearGradient></defs><title>Asset 10</title><g id="b5d53ff7-8fb6-422f-ad42-a4bc61cb9799" data-name="Layer 2"><g id="1e944220-65f1-43bb-b77e-a3c693328f69" data-name="Capa 1"><rect width="222" height="62" rx="30.43" ry="30.43" fill="url(#675ad169-c378-465d-bffa-291feb2f66cb)"/><path d="M70.5,33.43a2.76,2.76,0,0,1-1,2.28,4.49,4.49,0,0,1-2.9.84,6.79,6.79,0,0,1-3-.65V33.79a12.4,12.4,0,0,0,1.83.68,5.1,5.1,0,0,0,1.37.2,2,2,0,0,0,1.15-.28,1,1,0,0,0,.4-.85A.91.91,0,0,0,68.1,33a1.83,1.83,0,0,0-.51-.48,13.68,13.68,0,0,0-1.39-.72,6.12,6.12,0,0,1-1.47-.89,3.29,3.29,0,0,1-.79-1,2.86,2.86,0,0,1-.29-1.32,2.77,2.77,0,0,1,1-2.23,4,4,0,0,1,2.67-.81,6,6,0,0,1,1.59.2,10.67,10.67,0,0,1,1.58.55l-.73,1.77a9.32,9.32,0,0,0-1.42-.49,4.2,4.2,0,0,0-1.1-.14,1.46,1.46,0,0,0-1,.3,1,1,0,0,0-.34.78A1,1,0,0,0,66,29a1.64,1.64,0,0,0,.44.43,12.78,12.78,0,0,0,1.44.75A5.77,5.77,0,0,1,70,31.66,2.81,2.81,0,0,1,70.5,33.43Z" fill="#fff" stroke="#fff"/><path d="M76.58,36.4H74.31V27.58H71.4V25.69h8.09v1.89H76.58Z" fill="#fff" stroke="#fff"/><path d="M87.69,36.4l-.78-2.55H83l-.78,2.55H79.79l3.77-10.75h2.78L90.13,36.4ZM86.37,32c-.72-2.31-1.12-3.62-1.21-3.92s-.16-.54-.2-.72c-.16.63-.62,2.17-1.38,4.64Z" fill="#fff" stroke="#fff"/><path d="M93.75,32.29V36.4H91.48V25.69H94.6a5.33,5.33,0,0,1,3.23.8,3.16,3.16,0,0,1,.53,4.09,3.42,3.42,0,0,1-1.47,1.15q2.42,3.61,3.15,4.67H97.52L95,32.29Zm0-1.84h.74a2.77,2.77,0,0,0,1.58-.36A1.27,1.27,0,0,0,96.59,29a1.19,1.19,0,0,0-.53-1.09,3.23,3.23,0,0,0-1.62-.32h-.69Z" fill="#fff" stroke="#fff"/><path d="M105.52,36.4h-2.27V27.58h-2.91V25.69h8.08v1.89h-2.9Z" fill="#fff" stroke="#fff"/><path d="M120.08,25.69h2.29L118.73,36.4h-2.48l-3.63-10.71h2.29l2,6.37c.11.38.23.82.34,1.32s.2.85.23,1a17.14,17.14,0,0,1,.55-2.36Z" fill="#fff" stroke="#fff"/><path d="M123.72,36.4V25.69H126V36.4Z" fill="#fff" stroke="#fff"/><path d="M137.57,30.94A5.23,5.23,0,0,1,136.06,35a6.12,6.12,0,0,1-4.35,1.41h-3V25.69H132a5.65,5.65,0,0,1,4.08,1.39A5.1,5.1,0,0,1,137.57,30.94Zm-2.36.06q0-3.45-3.05-3.45H131v7h1C134.11,34.52,135.21,33.35,135.21,31Z" fill="#fff" stroke="#fff"/><path d="M146,36.4h-6.16V25.69H146v1.86h-3.89V29.9h3.62v1.86h-3.62v2.76H146Z" fill="#fff" stroke="#fff"/><path d="M157.91,31a5.81,5.81,0,0,1-1.32,4.09,5.71,5.71,0,0,1-7.56,0,5.82,5.82,0,0,1-1.32-4.1A5.76,5.76,0,0,1,149,26.93a5,5,0,0,1,3.79-1.41,4.9,4.9,0,0,1,3.78,1.42A5.84,5.84,0,0,1,157.91,31Zm-7.82,0a4.47,4.47,0,0,0,.68,2.7,2.39,2.39,0,0,0,2,.91q2.72,0,2.72-3.61t-2.71-3.62a2.42,2.42,0,0,0-2,.91A4.46,4.46,0,0,0,150.09,31Z" fill="#fff" stroke="#fff"/></g></g></svg>

После

Ширина:  |  Высота:  |  Размер: 2.8 KiB

Просмотреть файл

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 222 62"><defs><linearGradient id="3a76aa64-1cd8-4b04-aa11-725e643c499f" y1="31" x2="222" y2="31" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#e94c88"/><stop offset="1" stop-color="#f27da9"/></linearGradient></defs><title>Asset 11</title><g id="bd503e7d-6007-4c73-964b-f169e890007a" data-name="Layer 2"><g id="186196c8-201f-4053-b17a-f267630403ae" data-name="Capa 1"><rect width="222" height="62" rx="30.43" ry="30.43" fill="url(#3a76aa64-1cd8-4b04-aa11-725e643c499f)"/><path d="M74.29,34.43a2.76,2.76,0,0,1-1,2.28,4.49,4.49,0,0,1-2.9.84,6.79,6.79,0,0,1-3-.65V34.79a12.4,12.4,0,0,0,1.83.68,5.1,5.1,0,0,0,1.37.2,2,2,0,0,0,1.15-.28,1,1,0,0,0,.4-.85.91.91,0,0,0-.18-.56,1.83,1.83,0,0,0-.51-.48A13.68,13.68,0,0,0,70,32.78a6.12,6.12,0,0,1-1.47-.89,3.29,3.29,0,0,1-.79-1,2.86,2.86,0,0,1-.29-1.32,2.77,2.77,0,0,1,1-2.23,4,4,0,0,1,2.67-.81,6,6,0,0,1,1.59.2,10.67,10.67,0,0,1,1.58.55l-.73,1.77a9.32,9.32,0,0,0-1.42-.49,4.2,4.2,0,0,0-1.1-.14,1.46,1.46,0,0,0-1,.3,1,1,0,0,0-.34.78,1,1,0,0,0,.14.53,1.64,1.64,0,0,0,.44.43,12.78,12.78,0,0,0,1.44.75,5.77,5.77,0,0,1,2.06,1.44A2.81,2.81,0,0,1,74.29,34.43Z" fill="#fff" stroke="#fff"/><path d="M80.37,37.4H78.1V28.58H75.19V26.69h8.09v1.89H80.37Z" fill="#fff" stroke="#fff"/><path d="M94.64,32a5.81,5.81,0,0,1-1.32,4.09,5.71,5.71,0,0,1-7.56,0A5.87,5.87,0,0,1,84.45,32a5.76,5.76,0,0,1,1.32-4.09,5.76,5.76,0,0,1,7.56,0A5.8,5.8,0,0,1,94.64,32Zm-7.81,0a4.41,4.41,0,0,0,.68,2.7,2.36,2.36,0,0,0,2,.91c1.82,0,2.72-1.2,2.72-3.61s-.9-3.62-2.7-3.62a2.41,2.41,0,0,0-2,.91A4.46,4.46,0,0,0,86.83,32Z" fill="#fff" stroke="#fff"/><path d="M104.26,30a3.29,3.29,0,0,1-1.08,2.65,4.63,4.63,0,0,1-3.07.91h-1V37.4H96.86V26.69h3.42a4.52,4.52,0,0,1,3,.84A3,3,0,0,1,104.26,30Zm-5.13,1.7h.75a2.54,2.54,0,0,0,1.57-.41,1.48,1.48,0,0,0,.52-1.21,1.5,1.5,0,0,0-.44-1.18,2.08,2.08,0,0,0-1.37-.38h-1Z" fill="#fff" stroke="#fff"/><path d="M116.29,26.69h2.29L114.94,37.4h-2.48l-3.63-10.71h2.29l2,6.37c.11.38.22.82.34,1.32s.2.85.23,1a17.14,17.14,0,0,1,.55-2.36Z" fill="#fff" stroke="#fff"/><path d="M119.93,37.4V26.69h2.27V37.4Z" fill="#fff" stroke="#fff"/><path d="M133.78,31.94A5.27,5.27,0,0,1,132.27,36a6.12,6.12,0,0,1-4.35,1.41h-3V26.69h3.36a5.65,5.65,0,0,1,4.08,1.39A5.1,5.1,0,0,1,133.78,31.94Zm-2.36.06q0-3.45-3-3.45h-1.21v7h1C130.32,35.52,131.42,34.35,131.42,32Z" fill="#fff" stroke="#fff"/><path d="M142.16,37.4H136V26.69h6.16v1.86h-3.89V30.9h3.62v1.86h-3.62v2.76h3.89Z" fill="#fff" stroke="#fff"/><path d="M154.12,32a5.81,5.81,0,0,1-1.32,4.09,5.71,5.71,0,0,1-7.56,0,5.82,5.82,0,0,1-1.32-4.1,5.76,5.76,0,0,1,1.32-4.09,5.77,5.77,0,0,1,7.57,0A5.84,5.84,0,0,1,154.12,32Zm-7.82,0a4.47,4.47,0,0,0,.68,2.7,2.38,2.38,0,0,0,2,.91q2.72,0,2.72-3.61c0-2.41-.91-3.62-2.71-3.62a2.42,2.42,0,0,0-2,.91A4.46,4.46,0,0,0,146.3,32Z" fill="#fff" stroke="#fff"/></g></g></svg>

После

Ширина:  |  Высота:  |  Размер: 2.8 KiB

Просмотреть файл

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 222 62"><defs><linearGradient id="2258c86a-3a11-4958-b7db-91d10f350853" y1="31" x2="222" y2="31" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#bf1022"/><stop offset="1" stop-color="#ff4a3f"/></linearGradient></defs><title>Asset 12</title><g id="ca92f13e-c28a-451a-8081-6686bd5ee1f7" data-name="Layer 2"><g id="8d6aac0e-07ad-49cb-84ea-b55a6b888bd1" data-name="Capa 1"><rect width="222" height="62" rx="30.43" ry="30.43" fill="url(#2258c86a-3a11-4958-b7db-91d10f350853)"/><path d="M74.29,33.43a2.76,2.76,0,0,1-1,2.28,4.49,4.49,0,0,1-2.9.84,6.79,6.79,0,0,1-3-.65V33.79a12.4,12.4,0,0,0,1.83.68,5.1,5.1,0,0,0,1.37.2,2,2,0,0,0,1.15-.28,1,1,0,0,0,.4-.85.91.91,0,0,0-.18-.56,1.83,1.83,0,0,0-.51-.48A13.68,13.68,0,0,0,70,31.78a6.12,6.12,0,0,1-1.47-.89,3.29,3.29,0,0,1-.79-1,2.86,2.86,0,0,1-.29-1.32,2.77,2.77,0,0,1,1-2.23,4,4,0,0,1,2.67-.81,6,6,0,0,1,1.59.2,10.67,10.67,0,0,1,1.58.55l-.73,1.77a9.32,9.32,0,0,0-1.42-.49,4.2,4.2,0,0,0-1.1-.14,1.46,1.46,0,0,0-1,.3,1,1,0,0,0-.34.78,1,1,0,0,0,.14.53,1.64,1.64,0,0,0,.44.43,12.78,12.78,0,0,0,1.44.75,5.77,5.77,0,0,1,2.06,1.44A2.81,2.81,0,0,1,74.29,33.43Z" fill="#fff" stroke="#fff"/><path d="M80.37,36.4H78.1V27.58H75.19V25.69h8.09v1.89H80.37Z" fill="#fff" stroke="#fff"/><path d="M94.64,31a5.81,5.81,0,0,1-1.32,4.09,5.71,5.71,0,0,1-7.56,0A5.87,5.87,0,0,1,84.45,31a5.76,5.76,0,0,1,1.32-4.09,5.76,5.76,0,0,1,7.56,0A5.8,5.8,0,0,1,94.64,31Zm-7.81,0a4.41,4.41,0,0,0,.68,2.7,2.36,2.36,0,0,0,2,.91c1.82,0,2.72-1.2,2.72-3.61s-.9-3.62-2.7-3.62a2.41,2.41,0,0,0-2,.91A4.46,4.46,0,0,0,86.83,31Z" fill="#fff" stroke="#fff"/><path d="M104.26,29a3.29,3.29,0,0,1-1.08,2.65,4.63,4.63,0,0,1-3.07.91h-1V36.4H96.86V25.69h3.42a4.52,4.52,0,0,1,3,.84A3,3,0,0,1,104.26,29Zm-5.13,1.7h.75a2.54,2.54,0,0,0,1.57-.41,1.48,1.48,0,0,0,.52-1.21,1.5,1.5,0,0,0-.44-1.18,2.08,2.08,0,0,0-1.37-.38h-1Z" fill="#fff" stroke="#fff"/><path d="M116.29,25.69h2.29L114.94,36.4h-2.48l-3.63-10.71h2.29l2,6.37c.11.38.22.82.34,1.32s.2.85.23,1a17.14,17.14,0,0,1,.55-2.36Z" fill="#fff" stroke="#fff"/><path d="M119.93,36.4V25.69h2.27V36.4Z" fill="#fff" stroke="#fff"/><path d="M133.78,30.94A5.27,5.27,0,0,1,132.27,35a6.12,6.12,0,0,1-4.35,1.41h-3V25.69h3.36a5.65,5.65,0,0,1,4.08,1.39A5.1,5.1,0,0,1,133.78,30.94Zm-2.36.06q0-3.45-3-3.45h-1.21v7h1C130.32,34.52,131.42,33.35,131.42,31Z" fill="#fff" stroke="#fff"/><path d="M142.16,36.4H136V25.69h6.16v1.86h-3.89V29.9h3.62v1.86h-3.62v2.76h3.89Z" fill="#fff" stroke="#fff"/><path d="M154.12,31a5.81,5.81,0,0,1-1.32,4.09,5.71,5.71,0,0,1-7.56,0,5.82,5.82,0,0,1-1.32-4.1,5.76,5.76,0,0,1,1.32-4.09,5.77,5.77,0,0,1,7.57,0A5.84,5.84,0,0,1,154.12,31Zm-7.82,0a4.47,4.47,0,0,0,.68,2.7,2.38,2.38,0,0,0,2,.91q2.72,0,2.72-3.61c0-2.41-.91-3.62-2.71-3.62a2.42,2.42,0,0,0-2,.91A4.46,4.46,0,0,0,146.3,31Z" fill="#fff" stroke="#fff"/></g></g></svg>

После

Ширина:  |  Высота:  |  Размер: 2.8 KiB

Двоичные данные
sketch2code/Sketch2Code.Web/Content/img/button_success.png Normal file

Двоичный файл не отображается.

После

Ширина:  |  Высота:  |  Размер: 13 KiB

Двоичные данные
sketch2code/Sketch2Code.Web/Content/img/button_upload.png Normal file

Двоичный файл не отображается.

После

Ширина:  |  Высота:  |  Размер: 15 KiB

Просмотреть файл

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 222 62"><defs><style>.cls-1{fill:url(#Degradado_sin_nombre_27);}.cls-2{fill:#fff;}.cls-3{fill:#1aa978;}</style><linearGradient id="Degradado_sin_nombre_27" y1="31" x2="222" y2="31" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#1ad099"/><stop offset="1" stop-color="#76d449"/></linearGradient></defs><title>Asset 9</title><g id="Layer_2" data-name="Layer 2"><g id="Capa_1" data-name="Capa 1"><rect class="cls-1" width="222" height="62" rx="30.43" ry="30.43"/><path class="cls-2" d="M63.61,27.32v6.87a4.61,4.61,0,0,1-1.27,3.48,5,5,0,0,1-3.66,1.23,5,5,0,0,1-3.59-1.2,4.55,4.55,0,0,1-1.25-3.44V27.32h3.1V34a2.75,2.75,0,0,0,.45,1.76,1.65,1.65,0,0,0,1.34.55,1.61,1.61,0,0,0,1.37-.55A2.91,2.91,0,0,0,60.53,34V27.32Z"/><path class="cls-2" d="M74.62,31a3.84,3.84,0,0,1-1.13,3,4.57,4.57,0,0,1-3.21,1h-.86v3.79H66.33V27.32h4a4.81,4.81,0,0,1,3.25.94A3.36,3.36,0,0,1,74.62,31Zm-5.2,1.49H70a1.49,1.49,0,0,0,1.1-.4A1.37,1.37,0,0,0,71.49,31c0-.77-.42-1.16-1.28-1.16h-.79Z"/><path class="cls-2" d="M76.76,38.74V27.32h3.09v8.93h4.39v2.49Z"/><path class="cls-2" d="M97.08,33a6.18,6.18,0,0,1-1.41,4.39,6.43,6.43,0,0,1-8.27,0A6.17,6.17,0,0,1,86,33a6.08,6.08,0,0,1,1.43-4.36,6.47,6.47,0,0,1,8.27,0A6.17,6.17,0,0,1,97.08,33Zm-7.86,0c0,2.21.77,3.32,2.3,3.32a2,2,0,0,0,1.74-.81A4.37,4.37,0,0,0,93.83,33a4.34,4.34,0,0,0-.58-2.52,1.94,1.94,0,0,0-1.71-.82C90,29.67,89.22,30.78,89.22,33Z"/><path class="cls-2" d="M106.47,38.74l-.56-2.14H102.2l-.58,2.14H98.23L102,27.27h4.12l3.77,11.47Zm-1.2-4.67-.5-1.88c-.11-.41-.25-.95-.41-1.61s-.28-1.14-.33-1.43c0,.27-.14.71-.28,1.32s-.44,1.81-.91,3.6Z"/><path class="cls-2" d="M121.09,32.79a5.89,5.89,0,0,1-1.57,4.4,6,6,0,0,1-4.43,1.55H111.4V27.32h3.95a6,6,0,0,1,4.25,1.4A5.32,5.32,0,0,1,121.09,32.79Zm-3.2.11a3.65,3.65,0,0,0-.62-2.33,2.28,2.28,0,0,0-1.89-.76h-.9v6.4h.69a2.46,2.46,0,0,0,2.06-.82A3.9,3.9,0,0,0,117.89,32.9Z"/><path class="cls-2" d="M137.63,32.79a5.89,5.89,0,0,1-1.57,4.4,6.07,6.07,0,0,1-4.43,1.55h-3.69V27.32h3.95a6,6,0,0,1,4.25,1.4A5.35,5.35,0,0,1,137.63,32.79Zm-3.2.11a3.65,3.65,0,0,0-.62-2.33,2.29,2.29,0,0,0-1.89-.76H131v6.4h.69a2.46,2.46,0,0,0,2.06-.82A3.9,3.9,0,0,0,134.43,32.9Z"/><path class="cls-2" d="M146.78,38.74H140V27.32h6.78v2.47h-3.69v1.8h3.42v2.48h-3.42v2.15h3.69Z"/><path class="cls-2" d="M156.57,35.27a3.37,3.37,0,0,1-.54,1.89,3.59,3.59,0,0,1-1.55,1.28,5.89,5.89,0,0,1-2.39.46,10.09,10.09,0,0,1-1.91-.16,7.55,7.55,0,0,1-1.61-.56V35.43a8.72,8.72,0,0,0,1.84.7,6.75,6.75,0,0,0,1.75.26,1.67,1.67,0,0,0,1-.24.71.71,0,0,0,.32-.61.63.63,0,0,0-.13-.41,1.36,1.36,0,0,0-.41-.36c-.19-.12-.7-.36-1.52-.73a7.24,7.24,0,0,1-1.67-1,2.89,2.89,0,0,1-.83-1.09,3.62,3.62,0,0,1-.27-1.46A2.92,2.92,0,0,1,149.8,28a5,5,0,0,1,3.15-.89,9,9,0,0,1,3.62.82l-.95,2.39a6.83,6.83,0,0,0-2.76-.74,1.48,1.48,0,0,0-.88.21.65.65,0,0,0-.27.53.77.77,0,0,0,.35.6,13,13,0,0,0,1.88,1A5.33,5.33,0,0,1,156,33.35,3.12,3.12,0,0,1,156.57,35.27Z"/><path class="cls-2" d="M158.66,38.74V27.32h3.1V38.74Z"/><path class="cls-2" d="M169.13,32.05h4.93v6.16a13.51,13.51,0,0,1-4.41.69,5.37,5.37,0,0,1-4.09-1.53A6.16,6.16,0,0,1,164.12,33a5.75,5.75,0,0,1,1.58-4.31,6.09,6.09,0,0,1,4.42-1.54,9.53,9.53,0,0,1,2,.21,8.93,8.93,0,0,1,1.67.51l-1,2.42a6.12,6.12,0,0,0-2.71-.6,2.59,2.59,0,0,0-2.09.87,3.84,3.84,0,0,0-.74,2.52,3.83,3.83,0,0,0,.67,2.44,2.31,2.31,0,0,0,1.92.84,5.61,5.61,0,0,0,1.27-.14V34.44h-2Z"/><path class="cls-2" d="M187.58,38.74h-4l-4.17-8h-.08c.1,1.27.15,2.24.15,2.9v5.15h-2.73V27.32h4l4.16,7.94h0c-.07-1.16-.11-2.08-.11-2.78V27.32h2.75Z"/><polygon class="cls-3" points="42 31 32 21 22 31 26 31 26 41 38 41 38 31 42 31"/></g></g></svg>

После

Ширина:  |  Высота:  |  Размер: 3.6 KiB

Просмотреть файл

@ -0,0 +1,84 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="800px"
height="600px"
viewBox="0 0 800 600"
version="1.1"
id="SVGRoot"
inkscape:version="0.92.3 (2405546, 2018-03-11)"
sodipodi:docname="fake_img.svg">
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="0.64"
inkscape:cx="640.11049"
inkscape:cy="314.59265"
inkscape:document-units="px"
inkscape:current-layer="layer1"
showgrid="false"
inkscape:window-width="1366"
inkscape:window-height="705"
inkscape:window-x="-8"
inkscape:window-y="-8"
inkscape:window-maximized="1">
<inkscape:grid
type="xygrid"
id="grid871" />
</sodipodi:namedview>
<defs
id="defs10" />
<metadata
id="metadata13">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:groupmode="layer"
id="layer2"
inkscape:label="Layer 2">
<rect
style="fill:#f2f2f2;stroke-width:15.17062569"
id="rect869"
width="860"
height="642.51184"
x="-40"
y="-22.511812" />
</g>
<g
id="layer1"
inkscape:groupmode="layer"
inkscape:label="Layer 1">
<path
style="fill:none;stroke:#000000;stroke-width:17.92726135;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="M 820,-22.511812 -40,620"
id="path877"
inkscape:connector-curvature="0"
sodipodi:nodetypes="cc" />
<path
style="fill:none;stroke:#000000;stroke-width:17.92726135;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="M -40,-22.511812 820,620"
id="path877-7"
inkscape:connector-curvature="0"
sodipodi:nodetypes="cc" />
</g>
</svg>

После

Ширина:  |  Высота:  |  Размер: 2.4 KiB

Двоичные данные
sketch2code/Sketch2Code.Web/Content/img/how_to_01PNG.png Normal file

Двоичный файл не отображается.

После

Ширина:  |  Высота:  |  Размер: 215 KiB

Некоторые файлы не были показаны из-за слишком большого количества измененных файлов Показать больше