Various Fixes

This commit is contained in:
Ilya Laktyushin 2021-10-29 17:28:37 +04:00
parent 2b2d14f53f
commit b989b55a9a
30 changed files with 805 additions and 67 deletions

View File

@ -6976,6 +6976,10 @@ Sorry for the inconvenience.";
"Notifications.GroupChats" = "Group Chats";
"Notifications.Channels" = "Channels";
"Notifications.PrivateChatsTitle" = "Private Chats";
"Notifications.GroupChatsTitle" = "Group Chats";
"Notifications.ChannelsTitle" = "Channels";
"Notifications.CategoryExceptions_0" = "%@ exceptions";
"Notifications.CategoryExceptions_1" = "%@ exception";
"Notifications.CategoryExceptions_2" = "%@ exceptions";

View File

@ -491,6 +491,7 @@ private func availablePaymentMethods(form: BotPaymentForm, current: BotCheckoutP
final class BotCheckoutControllerNode: ItemListControllerNode, PKPaymentAuthorizationViewControllerDelegate {
private weak var controller: BotCheckoutController?
private let navigationBar: NavigationBar
private let context: AccountContext
private let messageId: EngineMessage.Id
private let present: (ViewController, Any?) -> Void
@ -528,6 +529,7 @@ final class BotCheckoutControllerNode: ItemListControllerNode, PKPaymentAuthoriz
init(controller: BotCheckoutController?, navigationBar: NavigationBar, context: AccountContext, invoice: TelegramMediaInvoice, messageId: EngineMessage.Id, inputData: Promise<BotCheckoutController.InputData?>, present: @escaping (ViewController, Any?) -> Void, dismissAnimated: @escaping () -> Void, completed: @escaping (String, EngineMessage.Id?) -> Void) {
self.controller = controller
self.navigationBar = navigationBar
self.context = context
self.messageId = messageId
self.present = present

View File

@ -68,6 +68,7 @@ class BotCheckoutHeaderItemNode: ListViewItemNode {
private let topStripeNode: ASDisplayNode
private let bottomStripeNode: ASDisplayNode
private let highlightedBackgroundNode: ASDisplayNode
private let maskNode: ASImageNode
private let imageNode: TransformImageNode
private let titleNode: TextNode
@ -86,6 +87,9 @@ class BotCheckoutHeaderItemNode: ListViewItemNode {
self.bottomStripeNode = ASDisplayNode()
self.bottomStripeNode.isLayerBacked = true
self.maskNode = ASImageNode()
self.maskNode.isUserInteractionEnabled = false
self.imageNode = TransformImageNode()
self.titleNode = TextNode()
@ -217,6 +221,29 @@ class BotCheckoutHeaderItemNode: ListViewItemNode {
if strongSelf.bottomStripeNode.supernode == nil {
strongSelf.insertSubnode(strongSelf.bottomStripeNode, at: 0)
}
if strongSelf.maskNode.supernode == nil {
strongSelf.addSubnode(strongSelf.maskNode)
}
let hasCorners = itemListHasRoundedBlockLayout(params)
var hasTopCorners = false
var hasBottomCorners = false
switch neighbors.top {
case .sameSection(false):
strongSelf.topStripeNode.isHidden = true
default:
hasTopCorners = true
strongSelf.topStripeNode.isHidden = hasCorners
}
switch neighbors.bottom {
case .sameSection(false):
break
default:
hasBottomCorners = true
strongSelf.bottomStripeNode.isHidden = hasCorners
}
strongSelf.maskNode.image = hasCorners ? PresentationResourcesItemList.cornersImage(item.theme, top: hasTopCorners, bottom: hasBottomCorners) : nil
strongSelf.bottomStripeNode.frame = CGRect(origin: CGPoint(x: 0.0, y: contentSize.height - separatorHeight), size: CGSize(width: params.width, height: separatorHeight))
@ -231,7 +258,8 @@ class BotCheckoutHeaderItemNode: ListViewItemNode {
strongSelf.botNameNode.frame = CGRect(origin: CGPoint(x: textFrame.minX, y: textFrame.maxY + textBotNameSpacing), size: botNameLayout.size)
strongSelf.backgroundNode.frame = CGRect(origin: CGPoint(x: 0.0, y: -1000.0), size: CGSize(width: params.width, height: contentSize.height + 1000.0))
strongSelf.backgroundNode.frame = CGRect(origin: CGPoint(), size: CGSize(width: params.width, height: contentSize.height))
strongSelf.maskNode.frame = strongSelf.backgroundNode.frame.insetBy(dx: params.leftInset, dy: 0.0)
strongSelf.highlightedBackgroundNode.frame = CGRect(origin: CGPoint(x: 0.0, y: -UIScreenPixel), size: CGSize(width: params.width, height: 44.0 + UIScreenPixel + UIScreenPixel))
}
})

View File

@ -80,7 +80,7 @@ final class BotCheckoutInfoController: ViewController {
}
override public func loadDisplayNode() {
self.displayNode = BotCheckoutInfoControllerNode(context: self.context, invoice: self.invoice, messageId: self.messageId, formInfo: self.initialFormInfo, focus: self.focus, theme: self.presentationData.theme, strings: self.presentationData.strings, dismiss: { [weak self] in
self.displayNode = BotCheckoutInfoControllerNode(context: self.context, navigationBar: self.navigationBar, invoice: self.invoice, messageId: self.messageId, formInfo: self.initialFormInfo, focus: self.focus, theme: self.presentationData.theme, strings: self.presentationData.strings, dismiss: { [weak self] in
self?.presentingViewController?.dismiss(animated: false, completion: nil)
}, openCountrySelection: { [weak self] in
if let strongSelf = self {

View File

@ -94,6 +94,7 @@ enum BotCheckoutInfoControllerStatus {
final class BotCheckoutInfoControllerNode: ViewControllerTracingNode, UIScrollViewDelegate {
private let context: AccountContext
private weak var navigationBar: NavigationBar?
private let invoice: BotPaymentInvoice
private let messageId: EngineMessage.Id
private var focus: BotCheckoutInfoControllerFocus?
@ -111,6 +112,8 @@ final class BotCheckoutInfoControllerNode: ViewControllerTracingNode, UIScrollVi
private let scrollNode: BotCheckoutInfoControllerScrollerNode
private let itemNodes: [[BotPaymentItemNode]]
private let leftOverlayNode: ASDisplayNode
private let rightOverlayNode: ASDisplayNode
private let addressItems: BotCheckoutInfoAddressItems?
private let nameItem: BotPaymentFieldItemNode?
@ -125,6 +128,7 @@ final class BotCheckoutInfoControllerNode: ViewControllerTracingNode, UIScrollVi
init(
context: AccountContext,
navigationBar: NavigationBar?,
invoice: BotPaymentInvoice,
messageId: EngineMessage.Id,
formInfo: BotPaymentRequestedInfo,
@ -138,6 +142,7 @@ final class BotCheckoutInfoControllerNode: ViewControllerTracingNode, UIScrollVi
present: @escaping (ViewController, Any?) -> Void
) {
self.context = context
self.navigationBar = navigationBar
self.invoice = invoice
self.messageId = messageId
self.formInfo = formInfo
@ -152,6 +157,10 @@ final class BotCheckoutInfoControllerNode: ViewControllerTracingNode, UIScrollVi
self.strings = strings
self.scrollNode = BotCheckoutInfoControllerScrollerNode()
self.leftOverlayNode = ASDisplayNode()
self.leftOverlayNode.isUserInteractionEnabled = false
self.rightOverlayNode = ASDisplayNode()
self.rightOverlayNode.isUserInteractionEnabled = false
var itemNodes: [[BotPaymentItemNode]] = []
@ -227,6 +236,9 @@ final class BotCheckoutInfoControllerNode: ViewControllerTracingNode, UIScrollVi
super.init()
self.backgroundColor = self.theme.list.blocksBackgroundColor
self.leftOverlayNode.backgroundColor = self.theme.list.blocksBackgroundColor
self.rightOverlayNode.backgroundColor = self.theme.list.blocksBackgroundColor
self.scrollNode.backgroundColor = nil
self.scrollNode.isOpaque = false
self.scrollNode.view.alwaysBounceVertical = true
@ -319,6 +331,12 @@ final class BotCheckoutInfoControllerNode: ViewControllerTracingNode, UIScrollVi
self.verifyDisposable.dispose()
}
override func didLoad() {
super.didLoad()
self.navigationBar?.updateBackgroundAlpha(0.0, transition: .immediate)
}
func updateCountry(_ iso2: String) {
if self.formInfo.shippingAddress?.countryIso2 != iso2, let name = AuthorizationSequenceCountrySelectionController.lookupCountryNameById(iso2, strings: self.strings) {
let shippingAddress: BotPaymentShippingAddress
@ -435,6 +453,12 @@ final class BotCheckoutInfoControllerNode: ViewControllerTracingNode, UIScrollVi
}
}
let inset = max(16.0, floor((layout.size.width - 674.0) / 2.0))
var sideInset: CGFloat = 0.0
if layout.size.width >= 375.0 {
sideInset = inset
}
for items in self.itemNodes {
if !items.isEmpty && items[0] is BotPaymentHeaderItemNode {
contentHeight += 24.0
@ -444,7 +468,7 @@ final class BotCheckoutInfoControllerNode: ViewControllerTracingNode, UIScrollVi
for i in 0 ..< items.count {
let item = items[i]
let itemHeight = item.updateLayout(theme: self.theme, width: layout.size.width, measuredInset: commonInset, previousItemNode: i == 0 ? nil : items[i - 1], nextItemNode: i == (items.count - 1) ? nil : items[i + 1], transition: transition)
let itemHeight = item.updateLayout(theme: self.theme, width: layout.size.width, sideInset: sideInset, measuredInset: commonInset, previousItemNode: i == 0 ? nil : items[i - 1], nextItemNode: i == (items.count - 1) ? nil : items[i + 1], transition: transition)
transition.updateFrame(node: item, frame: CGRect(origin: CGPoint(x: 0.0, y: contentHeight), size: CGSize(width: layout.size.width, height: itemHeight)))
contentHeight += itemHeight
}
@ -462,6 +486,16 @@ final class BotCheckoutInfoControllerNode: ViewControllerTracingNode, UIScrollVi
self.scrollNode.view.scrollIndicatorInsets = insets
self.scrollNode.view.ignoreUpdateBounds = false
if self.rightOverlayNode.supernode == nil {
self.insertSubnode(self.rightOverlayNode, aboveSubnode: self.scrollNode)
}
if self.leftOverlayNode.supernode == nil {
self.insertSubnode(self.leftOverlayNode, aboveSubnode: self.scrollNode)
}
self.leftOverlayNode.frame = CGRect(x: 0.0, y: 0.0, width: sideInset, height: layout.size.height)
self.rightOverlayNode.frame = CGRect(x: layout.size.width - sideInset, y: 0.0, width: sideInset, height: layout.size.height)
if let focus = self.focus {
var focusItem: ASDisplayNode?
switch focus {
@ -525,6 +559,11 @@ final class BotCheckoutInfoControllerNode: ViewControllerTracingNode, UIScrollVi
})
}
func scrollViewDidScroll(_ scrollView: UIScrollView) {
let value = scrollView.contentOffset.y + scrollView.contentInset.top
self.navigationBar?.updateBackgroundAlpha(min(30.0, value) / 30.0, transition: .immediate)
}
func scrollViewWillBeginDragging(_ scrollView: UIScrollView) {
self.focus = nil
}

View File

@ -72,7 +72,7 @@ final class BotCheckoutNativeCardEntryController: ViewController {
}
override public func loadDisplayNode() {
self.displayNode = BotCheckoutNativeCardEntryControllerNode(context: self.context, provider: self.provider, theme: self.presentationData.theme, strings: self.presentationData.strings, present: { [weak self] c, a in
self.displayNode = BotCheckoutNativeCardEntryControllerNode(context: self.context, navigationBar: self.navigationBar, provider: self.provider, theme: self.presentationData.theme, strings: self.presentationData.strings, present: { [weak self] c, a in
self?.present(c, in: .window(.root), with: a)
}, dismiss: { [weak self] in
self?.presentingViewController?.dismiss(animated: false, completion: nil)

View File

@ -43,6 +43,7 @@ private final class BotCheckoutNativeCardEntryScrollerNode: ASDisplayNode {
final class BotCheckoutNativeCardEntryControllerNode: ViewControllerTracingNode, UIScrollViewDelegate {
private let context: AccountContext
private weak var navigationBar: NavigationBar?
private let provider: BotCheckoutNativeCardEntryController.Provider
private let present: (ViewController, Any?) -> Void
@ -58,6 +59,8 @@ final class BotCheckoutNativeCardEntryControllerNode: ViewControllerTracingNode,
private let scrollNode: BotCheckoutNativeCardEntryScrollerNode
private let itemNodes: [[BotPaymentItemNode]]
private let leftOverlayNode: ASDisplayNode
private let rightOverlayNode: ASDisplayNode
private let cardItem: BotPaymentCardInputItemNode
private let cardholderItem: BotPaymentFieldItemNode?
@ -74,8 +77,9 @@ final class BotCheckoutNativeCardEntryControllerNode: ViewControllerTracingNode,
private var dataTask: URLSessionDataTask?
init(context: AccountContext, provider: BotCheckoutNativeCardEntryController.Provider, theme: PresentationTheme, strings: PresentationStrings, present: @escaping (ViewController, Any?) -> Void, dismiss: @escaping () -> Void, openCountrySelection: @escaping () -> Void, updateStatus: @escaping (BotCheckoutNativeCardEntryStatus) -> Void, completion: @escaping (BotCheckoutPaymentMethod) -> Void) {
init(context: AccountContext, navigationBar: NavigationBar?, provider: BotCheckoutNativeCardEntryController.Provider, theme: PresentationTheme, strings: PresentationStrings, present: @escaping (ViewController, Any?) -> Void, dismiss: @escaping () -> Void, openCountrySelection: @escaping () -> Void, updateStatus: @escaping (BotCheckoutNativeCardEntryStatus) -> Void, completion: @escaping (BotCheckoutPaymentMethod) -> Void) {
self.context = context
self.navigationBar = navigationBar
self.provider = provider
self.present = present
@ -88,6 +92,10 @@ final class BotCheckoutNativeCardEntryControllerNode: ViewControllerTracingNode,
self.strings = strings
self.scrollNode = BotCheckoutNativeCardEntryScrollerNode()
self.leftOverlayNode = ASDisplayNode()
self.leftOverlayNode.isUserInteractionEnabled = false
self.rightOverlayNode = ASDisplayNode()
self.rightOverlayNode.isUserInteractionEnabled = false
var itemNodes: [[BotPaymentItemNode]] = []
@ -95,7 +103,7 @@ final class BotCheckoutNativeCardEntryControllerNode: ViewControllerTracingNode,
var openCountrySelectionImpl: (() -> Void)?
self.cardItem = BotPaymentCardInputItemNode()
cardItem.updated = { data in
self.cardItem.updated = { data in
cardUpdatedImpl?(data)
}
itemNodes.append([BotPaymentHeaderItemNode(text: strings.Checkout_NewCard_PaymentCard), self.cardItem])
@ -164,6 +172,9 @@ final class BotCheckoutNativeCardEntryControllerNode: ViewControllerTracingNode,
super.init()
self.backgroundColor = self.theme.list.blocksBackgroundColor
self.leftOverlayNode.backgroundColor = self.theme.list.blocksBackgroundColor
self.rightOverlayNode.backgroundColor = self.theme.list.blocksBackgroundColor
self.scrollNode.backgroundColor = nil
self.scrollNode.isOpaque = false
if #available(iOSApplicationExtension 11.0, iOS 11.0, *) {
@ -216,7 +227,7 @@ final class BotCheckoutNativeCardEntryControllerNode: ViewControllerTracingNode,
}
}
cardItem.completed = { [weak self] in
self.cardItem.completed = { [weak self] in
self?.cardholderItem?.activateInput()
}
@ -228,6 +239,12 @@ final class BotCheckoutNativeCardEntryControllerNode: ViewControllerTracingNode,
self.dataTask?.cancel()
}
override func didLoad() {
super.didLoad()
self.navigationBar?.updateBackgroundAlpha(0.0, transition: .immediate)
}
func updateCountry(_ iso2: String) {
if let name = AuthorizationSequenceCountrySelectionController.lookupCountryNameById(iso2, strings: self.strings) {
self.currentCountryIso2 = iso2
@ -447,6 +464,12 @@ final class BotCheckoutNativeCardEntryControllerNode: ViewControllerTracingNode,
}
}
let inset = max(16.0, floor((layout.size.width - 674.0) / 2.0))
var sideInset: CGFloat = 0.0
if layout.size.width >= 375.0 {
sideInset = inset
}
for items in self.itemNodes {
if !items.isEmpty && items[0] is BotPaymentHeaderItemNode {
contentHeight += 24.0
@ -456,7 +479,7 @@ final class BotCheckoutNativeCardEntryControllerNode: ViewControllerTracingNode,
for i in 0 ..< items.count {
let item = items[i]
let itemHeight = item.updateLayout(theme: self.theme, width: layout.size.width, measuredInset: commonInset, previousItemNode: i == 0 ? nil : items[i - 1], nextItemNode: i == (items.count - 1) ? nil : items[i + 1], transition: transition)
let itemHeight = item.updateLayout(theme: self.theme, width: layout.size.width, sideInset: sideInset, measuredInset: commonInset, previousItemNode: i == 0 ? nil : items[i - 1], nextItemNode: i == (items.count - 1) ? nil : items[i + 1], transition: transition)
transition.updateFrame(node: item, frame: CGRect(origin: CGPoint(x: 0.0, y: contentHeight), size: CGSize(width: layout.size.width, height: itemHeight)))
contentHeight += itemHeight
}
@ -482,6 +505,16 @@ final class BotCheckoutNativeCardEntryControllerNode: ViewControllerTracingNode,
}
self.scrollNode.view.ignoreUpdateBounds = false
if self.rightOverlayNode.supernode == nil {
self.insertSubnode(self.rightOverlayNode, aboveSubnode: self.scrollNode)
}
if self.leftOverlayNode.supernode == nil {
self.insertSubnode(self.leftOverlayNode, aboveSubnode: self.scrollNode)
}
self.leftOverlayNode.frame = CGRect(x: 0.0, y: 0.0, width: sideInset, height: layout.size.height)
self.rightOverlayNode.frame = CGRect(x: layout.size.width - sideInset, y: 0.0, width: sideInset, height: layout.size.height)
if let previousLayout = previousLayout {
var previousInsets = previousLayout.0.insets(options: [.input])
previousInsets.top += max(previousLayout.1, previousLayout.0.insets(options: [.statusBar]).top)
@ -514,4 +547,10 @@ final class BotCheckoutNativeCardEntryControllerNode: ViewControllerTracingNode,
func activate() {
self.cardItem.activateInput()
}
func scrollViewDidScroll(_ scrollView: UIScrollView) {
let value = scrollView.contentOffset.y + scrollView.contentInset.top
self.navigationBar?.updateBackgroundAlpha(min(30.0, value) / 30.0, transition: .immediate)
}
}

View File

@ -92,6 +92,7 @@ class BotCheckoutPriceItemNode: ListViewItemNode {
let backgroundNode: ASDisplayNode
let separatorNode: ASDisplayNode
let bottomSeparatorNode: ASDisplayNode
private let maskNode: ASImageNode
private var placeholderNode: ShimmerEffectNode?
private var absoluteLocation: (CGRect, CGSize)?
@ -109,6 +110,9 @@ class BotCheckoutPriceItemNode: ListViewItemNode {
self.separatorNode = ASDisplayNode()
self.bottomSeparatorNode = ASDisplayNode()
self.maskNode = ASImageNode()
self.maskNode.isUserInteractionEnabled = false
super.init(layerBacked: false, dynamicBounce: false)
self.addSubnode(self.backgroundNode)
@ -180,23 +184,39 @@ class BotCheckoutPriceItemNode: ListViewItemNode {
let leftInset: CGFloat = 16.0 + params.leftInset
strongSelf.separatorNode.isHidden = !item.hasSeparator
strongSelf.separatorNode.backgroundColor = item.theme.list.itemBlocksSeparatorColor
strongSelf.separatorNode.frame = CGRect(origin: CGPoint(x: leftInset, y: 0.0), size: CGSize(width: params.width - leftInset, height: UIScreenPixel))
if strongSelf.maskNode.supernode == nil {
strongSelf.addSubnode(strongSelf.maskNode)
}
let hasCorners = itemListHasRoundedBlockLayout(params)
var hasTopCorners = false
var hasBottomCorners = false
switch neighbors.top {
case .sameSection(false):
break
default:
hasTopCorners = true
}
switch neighbors.bottom {
case .otherSection, .none:
case .sameSection(false):
strongSelf.bottomSeparatorNode.isHidden = false
default:
strongSelf.bottomSeparatorNode.isHidden = !item.isFinal
hasBottomCorners = true
strongSelf.bottomSeparatorNode.isHidden = !item.isFinal || hasCorners
}
strongSelf.separatorNode.isHidden = !item.hasSeparator || (hasCorners && hasTopCorners)
strongSelf.separatorNode.backgroundColor = item.theme.list.itemBlocksSeparatorColor
strongSelf.separatorNode.frame = CGRect(origin: CGPoint(x: leftInset, y: 0.0), size: CGSize(width: params.width - leftInset, height: UIScreenPixel))
strongSelf.maskNode.image = hasCorners ? PresentationResourcesItemList.cornersImage(item.theme, top: hasTopCorners, bottom: hasBottomCorners) : nil
strongSelf.bottomSeparatorNode.backgroundColor = item.theme.list.itemBlocksSeparatorColor
strongSelf.bottomSeparatorNode.frame = CGRect(origin: CGPoint(x: 0.0, y: contentSize.height), size: CGSize(width: params.width, height: UIScreenPixel))
strongSelf.backgroundNode.backgroundColor = item.theme.list.itemBlocksBackgroundColor
strongSelf.backgroundNode.frame = CGRect(origin: CGPoint(), size: CGSize(width: params.width, height: contentSize.height))
strongSelf.maskNode.frame = strongSelf.backgroundNode.frame.insetBy(dx: params.leftInset, dy: 0.0)
strongSelf.titleNode.frame = CGRect(origin: CGPoint(x: leftInset, y: verticalOffset + floor((naturalContentHeight - titleLayout.size.height) / 2.0)), size: titleLayout.size)
strongSelf.labelNode.frame = CGRect(origin: CGPoint(x: params.width - rightInset - labelLayout.size.width, y: verticalOffset + floor((naturalContentHeight - labelLayout.size.height) / 2.0)), size: labelLayout.size)

View File

@ -467,6 +467,7 @@ private final class FormatterImpl: NSObject, UITextFieldDelegate {
class BotCheckoutTipItemNode: ListViewItemNode, UITextFieldDelegate {
private let backgroundNode: ASDisplayNode
private let maskNode: ASImageNode
let titleNode: TextNode
let labelNode: TextNode
let tipMeasurementNode: ImmediateTextNode
@ -505,6 +506,9 @@ class BotCheckoutTipItemNode: ListViewItemNode, UITextFieldDelegate {
self.scrollNode.view.contentInsetAdjustmentBehavior = .never
}
self.maskNode = ASImageNode()
self.maskNode.isUserInteractionEnabled = false
super.init(layerBacked: false, dynamicBounce: false)
self.addSubnode(self.backgroundNode)

View File

@ -63,20 +63,20 @@ final class BotPaymentActionItemNode: BotPaymentItemNode {
return 0.0
}
override func layoutContents(theme: PresentationTheme, width: CGFloat, measuredInset: CGFloat, transition: ContainedViewLayoutTransition) -> CGFloat {
override func layoutContents(theme: PresentationTheme, width: CGFloat, sideInset: CGFloat, measuredInset: CGFloat, transition: ContainedViewLayoutTransition) -> CGFloat {
if self.theme !== theme {
self.theme = theme
self.highlightedBackgroundNode.backgroundColor = theme.list.itemHighlightedBackgroundColor
self.titleNode.attributedText = NSAttributedString(string: self.title, font: titleFont, textColor: theme.list.itemAccentColor)
}
self.buttonNode.frame = CGRect(origin: CGPoint(), size: CGSize(width: width, height: 44.0))
self.buttonNode.frame = CGRect(origin: CGPoint(x: sideInset, y: 0.0), size: CGSize(width: width - sideInset * 2.0, height: 44.0))
transition.updateFrame(node: self.highlightedBackgroundNode, frame: CGRect(origin: CGPoint(), size: CGSize(width: width, height: 44.0 + UIScreenPixel)))
let leftInset: CGFloat = 16.0
let titleSize = self.titleNode.measure(CGSize(width: width - leftInset - 32.0, height: CGFloat.greatestFiniteMagnitude))
transition.updateFrame(node: self.titleNode, frame: CGRect(origin: CGPoint(x: leftInset, y: 11.0), size: titleSize))
let titleSize = self.titleNode.measure(CGSize(width: width - leftInset - 32.0 - sideInset * 2.0, height: CGFloat.greatestFiniteMagnitude))
transition.updateFrame(node: self.titleNode, frame: CGRect(origin: CGPoint(x: leftInset + sideInset, y: 11.0), size: titleSize))
return 44.0
}

View File

@ -35,7 +35,7 @@ final class BotPaymentCardInputItemNode: BotPaymentItemNode, STPPaymentCardTextF
return 0.0
}
override func layoutContents(theme: PresentationTheme, width: CGFloat, measuredInset: CGFloat, transition: ContainedViewLayoutTransition) -> CGFloat {
override func layoutContents(theme: PresentationTheme, width: CGFloat, sideInset: CGFloat, measuredInset: CGFloat, transition: ContainedViewLayoutTransition) -> CGFloat {
if self.theme !== theme {
self.theme = theme
@ -45,7 +45,7 @@ final class BotPaymentCardInputItemNode: BotPaymentItemNode, STPPaymentCardTextF
self.cardField.keyboardAppearance = theme.rootController.keyboardColor.keyboardAppearance
}
self.cardField.frame = CGRect(origin: CGPoint(x: 5.0, y: 0.0), size: CGSize(width: width - 10.0, height: 44.0))
self.cardField.frame = CGRect(origin: CGPoint(x: 5.0 + sideInset, y: 0.0), size: CGSize(width: width - 10.0 - sideInset * 2.0, height: 44.0))
return 44.0
}

View File

@ -90,7 +90,7 @@ class BotPaymentDisclosureItemNode: BotPaymentItemNode {
}
}
override func layoutContents(theme: PresentationTheme, width: CGFloat, measuredInset: CGFloat, transition: ContainedViewLayoutTransition) -> CGFloat {
override func layoutContents(theme: PresentationTheme, width: CGFloat, sideInset: CGFloat, measuredInset: CGFloat, transition: ContainedViewLayoutTransition) -> CGFloat {
if self.theme !== theme {
self.theme = theme
self.highlightedBackgroundNode.backgroundColor = theme.list.itemHighlightedBackgroundColor
@ -102,13 +102,13 @@ class BotPaymentDisclosureItemNode: BotPaymentItemNode {
}
}
self.buttonNode.frame = CGRect(origin: CGPoint(), size: CGSize(width: width, height: 44.0))
self.buttonNode.frame = CGRect(origin: CGPoint(x: sideInset, y: 0.0), size: CGSize(width: width - sideInset * 2.0, height: 44.0))
transition.updateFrame(node: self.highlightedBackgroundNode, frame: CGRect(origin: CGPoint(), size: CGSize(width: width, height: 44.0 + UIScreenPixel)))
let leftInset: CGFloat = 16.0
let titleSize = self.titleNode.measure(CGSize(width: width - leftInset - 70.0, height: CGFloat.greatestFiniteMagnitude))
transition.updateFrame(node: self.titleNode, frame: CGRect(origin: CGPoint(x: leftInset, y: 11.0), size: titleSize))
let titleSize = self.titleNode.measure(CGSize(width: width - leftInset - 70.0 - sideInset * 2.0, height: CGFloat.greatestFiniteMagnitude))
transition.updateFrame(node: self.titleNode, frame: CGRect(origin: CGPoint(x: leftInset + sideInset, y: 11.0), size: titleSize))
var textInset = leftInset
if !titleSize.width.isZero {
@ -116,8 +116,8 @@ class BotPaymentDisclosureItemNode: BotPaymentItemNode {
}
textInset = max(measuredInset, textInset)
let textSize = self.textNode.measure(CGSize(width: width - measuredInset - 8.0, height: CGFloat.greatestFiniteMagnitude))
transition.updateFrame(node: self.textNode, frame: CGRect(origin: CGPoint(x: textInset, y: 11.0), size: textSize))
let textSize = self.textNode.measure(CGSize(width: width - measuredInset - 8.0 - sideInset * 2.0, height: CGFloat.greatestFiniteMagnitude))
transition.updateFrame(node: self.textNode, frame: CGRect(origin: CGPoint(x: textInset + sideInset, y: 11.0), size: textSize))
return 44.0
}

View File

@ -96,7 +96,7 @@ final class BotPaymentFieldItemNode: BotPaymentItemNode, UITextFieldDelegate {
}
}
override func layoutContents(theme: PresentationTheme, width: CGFloat, measuredInset: CGFloat, transition: ContainedViewLayoutTransition) -> CGFloat {
override func layoutContents(theme: PresentationTheme, width: CGFloat, sideInset: CGFloat, measuredInset: CGFloat, transition: ContainedViewLayoutTransition) -> CGFloat {
if self.theme !== theme {
self.theme = theme
self.titleNode.attributedText = NSAttributedString(string: self.title, font: titleFont, textColor: theme.list.itemPrimaryTextColor)
@ -106,9 +106,9 @@ final class BotPaymentFieldItemNode: BotPaymentItemNode, UITextFieldDelegate {
let leftInset: CGFloat = 16.0
let titleSize = self.titleNode.measure(CGSize(width: width - leftInset - 70.0, height: CGFloat.greatestFiniteMagnitude))
let titleSize = self.titleNode.measure(CGSize(width: width - leftInset - 70.0 - sideInset * 2.0, height: CGFloat.greatestFiniteMagnitude))
transition.updateFrame(node: self.titleNode, frame: CGRect(origin: CGPoint(x: leftInset, y: 11.0), size: titleSize))
transition.updateFrame(node: self.titleNode, frame: CGRect(origin: CGPoint(x: leftInset + sideInset, y: 11.0), size: titleSize))
var textInset = leftInset
if !titleSize.width.isZero {
@ -117,7 +117,7 @@ final class BotPaymentFieldItemNode: BotPaymentItemNode, UITextFieldDelegate {
textInset = max(measuredInset, textInset)
transition.updateFrame(node: self.textField, frame: CGRect(origin: CGPoint(x: textInset, y: 0.0), size: CGSize(width: max(1.0, width - textInset - 8.0), height: 40.0)))
transition.updateFrame(node: self.textField, frame: CGRect(origin: CGPoint(x: textInset + sideInset, y: 0.0), size: CGSize(width: max(1.0, width - textInset - 8.0), height: 40.0)))
return 44.0
}

View File

@ -22,7 +22,7 @@ final class BotPaymentHeaderItemNode: BotPaymentItemNode {
self.addSubnode(self.textNode)
}
override func layoutContents(theme: PresentationTheme, width: CGFloat, measuredInset: CGFloat, transition: ContainedViewLayoutTransition) -> CGFloat {
override func layoutContents(theme: PresentationTheme, width: CGFloat, sideInset: CGFloat, measuredInset: CGFloat, transition: ContainedViewLayoutTransition) -> CGFloat {
if self.theme !== theme {
self.theme = theme
self.textNode.attributedText = NSAttributedString(string: self.text, font: titleFont, textColor: theme.list.sectionHeaderTextColor)
@ -30,9 +30,9 @@ final class BotPaymentHeaderItemNode: BotPaymentItemNode {
let leftInset: CGFloat = 16.0
let textSize = self.textNode.measure(CGSize(width: width - leftInset - 10.0, height: CGFloat.greatestFiniteMagnitude))
let textSize = self.textNode.measure(CGSize(width: width - leftInset - 10.0 - sideInset * 2.0, height: CGFloat.greatestFiniteMagnitude))
transition.updateFrame(node: self.textNode, frame: CGRect(origin: CGPoint(x: leftInset, y: 7.0), size: textSize))
transition.updateFrame(node: self.textNode, frame: CGRect(origin: CGPoint(x: leftInset + sideInset, y: 7.0), size: textSize))
return 30.0
}

View File

@ -4,12 +4,17 @@ import AsyncDisplayKit
import Display
import TelegramPresentationData
private func botPaymentListHasRoundedBlockLayout(_ width: CGFloat) -> Bool {
return width >= 375.0
}
class BotPaymentItemNode: ASDisplayNode {
private let needsBackground: Bool
let backgroundNode: ASDisplayNode
private let topSeparatorNode: ASDisplayNode
private let bottomSeparatorNode: ASDisplayNode
private let maskNode: ASImageNode
private var theme: PresentationTheme?
@ -20,6 +25,9 @@ class BotPaymentItemNode: ASDisplayNode {
self.topSeparatorNode = ASDisplayNode()
self.bottomSeparatorNode = ASDisplayNode()
self.maskNode = ASImageNode()
self.maskNode.isUserInteractionEnabled = false
super.init()
if needsBackground {
@ -33,7 +41,7 @@ class BotPaymentItemNode: ASDisplayNode {
return 0.0
}
final func updateLayout(theme: PresentationTheme, width: CGFloat, measuredInset: CGFloat, previousItemNode: BotPaymentItemNode?, nextItemNode: BotPaymentItemNode?, transition: ContainedViewLayoutTransition) -> CGFloat {
final func updateLayout(theme: PresentationTheme, width: CGFloat, sideInset: CGFloat, measuredInset: CGFloat, previousItemNode: BotPaymentItemNode?, nextItemNode: BotPaymentItemNode?, transition: ContainedViewLayoutTransition) -> CGFloat {
if self.theme !== theme {
self.theme = theme
self.backgroundNode.backgroundColor = theme.list.itemBlocksBackgroundColor
@ -41,28 +49,43 @@ class BotPaymentItemNode: ASDisplayNode {
self.bottomSeparatorNode.backgroundColor = theme.list.itemBlocksSeparatorColor
}
let height = self.layoutContents(theme: theme, width: width, measuredInset: measuredInset, transition: transition)
let height = self.layoutContents(theme: theme, width: width, sideInset: sideInset, measuredInset: measuredInset, transition: transition)
var topSeparatorInset: CGFloat = 0.0
if self.maskNode.supernode == nil {
self.addSubnode(self.maskNode)
}
let hasCorners = botPaymentListHasRoundedBlockLayout(width)
var hasTopCorners = false
var hasBottomCorners = false
if let previousItemNode = previousItemNode, previousItemNode.needsBackground {
topSeparatorInset = 16.0
} else {
hasTopCorners = true
self.topSeparatorNode.isHidden = hasCorners
}
if let nextItemNode = nextItemNode, nextItemNode.needsBackground {
self.bottomSeparatorNode.isHidden = true
} else {
hasBottomCorners = true
self.bottomSeparatorNode.isHidden = hasCorners
}
if let nextItemNode = nextItemNode, nextItemNode.needsBackground {
bottomSeparatorNode.isHidden = true
} else {
bottomSeparatorNode.isHidden = false
}
self.maskNode.image = hasCorners ? PresentationResourcesItemList.cornersImage(theme, top: hasTopCorners, bottom: hasBottomCorners) : nil
transition.updateFrame(node: self.backgroundNode, frame: CGRect(origin: CGPoint(), size: CGSize(width: width, height: height)))
transition.updateFrame(node: self.topSeparatorNode, frame: CGRect(origin: CGPoint(x: topSeparatorInset, y: 0.0), size: CGSize(width: width - topSeparatorInset, height: UIScreenPixel)))
transition.updateFrame(node: self.bottomSeparatorNode, frame: CGRect(origin: CGPoint(x: 0.0, y: height - UIScreenPixel), size: CGSize(width: width, height: UIScreenPixel)))
transition.updateFrame(node: self.maskNode, frame: self.backgroundNode.frame.insetBy(dx: sideInset, dy: 0.0))
transition.updateFrame(node: self.topSeparatorNode, frame: CGRect(origin: CGPoint(x: topSeparatorInset + sideInset, y: 0.0), size: CGSize(width: width - topSeparatorInset - sideInset - sideInset, height: UIScreenPixel)))
transition.updateFrame(node: self.bottomSeparatorNode, frame: CGRect(origin: CGPoint(x: sideInset, y: height - UIScreenPixel), size: CGSize(width: width - sideInset - sideInset, height: UIScreenPixel)))
return height
}
func layoutContents(theme: PresentationTheme, width: CGFloat, measuredInset: CGFloat, transition: ContainedViewLayoutTransition) -> CGFloat {
func layoutContents(theme: PresentationTheme, width: CGFloat, sideInset: CGFloat, measuredInset: CGFloat, transition: ContainedViewLayoutTransition) -> CGFloat {
return 0.0
}
}

View File

@ -60,7 +60,7 @@ final class BotPaymentSwitchItemNode: BotPaymentItemNode {
}
}
override func layoutContents(theme: PresentationTheme, width: CGFloat, measuredInset: CGFloat, transition: ContainedViewLayoutTransition) -> CGFloat {
override func layoutContents(theme: PresentationTheme, width: CGFloat, sideInset: CGFloat, measuredInset: CGFloat, transition: ContainedViewLayoutTransition) -> CGFloat {
if self.theme !== theme {
self.theme = theme
self.titleNode.attributedText = NSAttributedString(string: self.title, font: titleFont, textColor: theme.list.itemPrimaryTextColor)
@ -72,12 +72,12 @@ final class BotPaymentSwitchItemNode: BotPaymentItemNode {
let leftInset: CGFloat = 16.0
let titleSize = self.titleNode.measure(CGSize(width: width - leftInset - 70.0, height: CGFloat.greatestFiniteMagnitude))
let titleSize = self.titleNode.measure(CGSize(width: width - leftInset - 70.0 - sideInset * 2.0, height: CGFloat.greatestFiniteMagnitude))
transition.updateFrame(node: self.titleNode, frame: CGRect(origin: CGPoint(x: leftInset, y: 11.0), size: titleSize))
transition.updateFrame(node: self.titleNode, frame: CGRect(origin: CGPoint(x: leftInset + sideInset, y: 11.0), size: titleSize))
let switchSize = self.switchNode.measure(CGSize(width: 100.0, height: 100.0))
let switchFrame = CGRect(origin: CGPoint(x: width - switchSize.width - 15.0, y: 6.0), size: switchSize)
let switchFrame = CGRect(origin: CGPoint(x: width - switchSize.width - 15.0 - sideInset, y: 6.0), size: switchSize)
transition.updateFrame(node: self.switchNode, frame: switchFrame)
transition.updateFrame(node: self.buttonNode, frame: switchFrame)

View File

@ -22,7 +22,7 @@ final class BotPaymentTextItemNode: BotPaymentItemNode {
self.addSubnode(self.textNode)
}
override func layoutContents(theme: PresentationTheme, width: CGFloat, measuredInset: CGFloat, transition: ContainedViewLayoutTransition) -> CGFloat {
override func layoutContents(theme: PresentationTheme, width: CGFloat, sideInset: CGFloat, measuredInset: CGFloat, transition: ContainedViewLayoutTransition) -> CGFloat {
if self.theme !== theme {
self.theme = theme
self.textNode.attributedText = NSAttributedString(string: self.text, font: textFont, textColor: theme.list.sectionHeaderTextColor)
@ -30,9 +30,9 @@ final class BotPaymentTextItemNode: BotPaymentItemNode {
let leftInset: CGFloat = 16.0
let textSize = self.textNode.measure(CGSize(width: width - leftInset - 10.0, height: CGFloat.greatestFiniteMagnitude))
let textSize = self.textNode.measure(CGSize(width: width - leftInset - 10.0 - sideInset * 2.0, height: CGFloat.greatestFiniteMagnitude))
transition.updateFrame(node: self.textNode, frame: CGRect(origin: CGPoint(x: leftInset, y: 7.0), size: textSize))
transition.updateFrame(node: self.textNode, frame: CGRect(origin: CGPoint(x: leftInset + sideInset, y: 7.0), size: textSize))
return textSize.height + 7.0 + 7.0
}

View File

@ -144,6 +144,7 @@ public class ItemListDisclosureItemNode: ListViewItemNode, ItemListItemNode {
self.backgroundNode.backgroundColor = .white
self.maskNode = ASImageNode()
self.maskNode.isUserInteractionEnabled = false
self.topStripeNode = ASDisplayNode()
self.topStripeNode.isLayerBacked = true

View File

@ -271,7 +271,7 @@ private func notificationsPeerCategoryEntries(category: NotificationsPeerCategor
entries.append(.sound(presentationData.theme, presentationData.strings.Notifications_MessageNotificationsSound, localizedPeerNotificationSoundString(strings: presentationData.strings, sound: filteredGlobalSound(notificationSettings.sound)), filteredGlobalSound(notificationSettings.sound)))
}
entries.append(.exceptionsHeader(presentationData.theme, presentationData.strings.Notifications_MessageNotifications.uppercased()))
entries.append(.exceptionsHeader(presentationData.theme, presentationData.strings.Notifications_MessageNotificationsExceptions.uppercased()))
entries.append(.addException(presentationData.theme, presentationData.strings.Notification_Exceptions_AddException))
@ -732,7 +732,16 @@ public func notificationsPeerCategoryController(context: AccountContext, categor
rightNavigationButton = nil
}
let controllerState = ItemListControllerState(presentationData: ItemListPresentationData(presentationData), title: .text(presentationData.strings.Notifications_Title), leftNavigationButton: leftNavigationButton, rightNavigationButton: rightNavigationButton, backNavigationButton: ItemListBackButton(title: presentationData.strings.Common_Back), animateChanges: true)
let title: String
switch category {
case .privateChat:
title = presentationData.strings.Notifications_PrivateChatsTitle
case .group:
title = presentationData.strings.Notifications_GroupChatsTitle
case .channel:
title = presentationData.strings.Notifications_ChannelsTitle
}
let controllerState = ItemListControllerState(presentationData: ItemListPresentationData(presentationData), title: .text(title), leftNavigationButton: leftNavigationButton, rightNavigationButton: rightNavigationButton, backNavigationButton: ItemListBackButton(title: presentationData.strings.Common_Back), animateChanges: true)
let listState = ItemListNodeState(presentationData: ItemListPresentationData(presentationData), entries: entries, style: .blocks, ensureVisibleItemTag: focusOnItemTag, initialScrollToItem: scrollToItem)
return (controllerState, (listState, arguments))

View File

@ -138,6 +138,15 @@ func iconForSession(_ session: RecentAccountSession) -> (UIImage?, String?) {
if platform.contains("android") {
return (UIImage(bundleImageName: "Settings/Devices/Android"), "device_android")
}
if device.contains("iphone") {
return (UIImage(bundleImageName: "Settings/Devices/iPhone"), nil)
}
if device.contains("ipad") {
return (UIImage(bundleImageName: "Settings/Devices/iPad"), nil)
}
if (platform.contains("macos") || systemVersion.contains("macos")) && device.contains("mac") {
return (UIImage(bundleImageName: "Settings/Devices/Mac"), nil)
}
if platform.contains("ios") || platform.contains("macos") || systemVersion.contains("macos") {
return (UIImage(bundleImageName: "Settings/Devices/iOS"), nil)
}
@ -278,7 +287,12 @@ class ItemListRecentSessionItemNode: ItemListRevealOptionsItemNode {
let rightInset: CGFloat = params.rightInset
titleAttributedString = NSAttributedString(string: "\(item.session.appName) \(item.session.appVersion)", font: titleFont, textColor: item.presentationData.theme.list.itemPrimaryTextColor)
var appVersion = item.session.appVersion
appVersion = appVersion.replacingOccurrences(of: "APPSTORE", with: "").replacingOccurrences(of: "BETA", with: "Beta").trimmingTrailingSpaces()
if let openingRoundBraceRange = appVersion.range(of: " ("), let closingRoundBraceRange = appVersion.range(of: ")") {
appVersion = appVersion.replacingCharacters(in: openingRoundBraceRange.lowerBound ..< closingRoundBraceRange.upperBound, with: "")
}
titleAttributedString = NSAttributedString(string: "\(item.session.appName) \(appVersion)", font: titleFont, textColor: item.presentationData.theme.list.itemPrimaryTextColor)
var deviceString = ""
if !item.session.deviceModel.isEmpty {
@ -291,14 +305,7 @@ class ItemListRecentSessionItemNode: ItemListRevealOptionsItemNode {
}
deviceString += item.session.platform
}
if !item.session.systemVersion.isEmpty {
if !deviceString.isEmpty {
deviceString += ", "
}
deviceString += item.session.systemVersion
}
var updatedIcon: UIImage?
if item.session != currentItem?.session {
updatedIcon = iconForSession(item.session).0

View File

@ -250,7 +250,10 @@ private class RecentSessionScreenNode: ViewControllerTracingNode, UIScrollViewDe
switch subject {
case let .session(session):
self.terminateButton.title = self.presentationData.strings.AuthSessions_View_TerminateSession
title = "\(session.appName) \(session.appVersion)"
var appVersion = session.appVersion
appVersion = appVersion.replacingOccurrences(of: "APPSTORE", with: "").replacingOccurrences(of: "BETA", with: "Beta").trimmingTrailingSpaces()
title = "\(session.appName) \(appVersion)"
if session.isCurrent {
subtitle = presentationData.strings.Presence_online
subtitleActive = true

View File

@ -0,0 +1,12 @@
{
"images" : [
{
"filename" : "mac_30.pdf",
"idiom" : "universal"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

View File

@ -0,0 +1,135 @@
%PDF-1.7
1 0 obj
<< >>
endobj
2 0 obj
<< /Length 3 0 R >>
stream
/DeviceRGB CS
/DeviceRGB cs
q
1.000000 0.000000 -0.000000 1.000000 0.000000 0.000000 cm
0.000000 0.478431 1.000000 scn
0.000000 45.119995 m
0.000000 54.528881 0.000000 59.233322 1.831091 62.827042 c
3.441763 65.988159 6.011837 68.558235 9.172960 70.168907 c
12.766678 72.000000 17.471119 72.000000 26.880003 72.000000 c
45.119995 72.000000 l
54.528881 72.000000 59.233322 72.000000 62.827042 70.168907 c
65.988167 68.558235 68.558235 65.988159 70.168907 62.827042 c
72.000000 59.233322 72.000000 54.528881 72.000000 45.119995 c
72.000000 26.880005 l
72.000000 17.471119 72.000000 12.766678 70.168907 9.172958 c
68.558235 6.011833 65.988167 3.441765 62.827042 1.831093 c
59.233322 0.000000 54.528881 0.000000 45.119999 0.000000 c
26.880005 0.000000 l
17.471119 0.000000 12.766678 0.000000 9.172960 1.831093 c
6.011837 3.441765 3.441763 6.011833 1.831091 9.172958 c
0.000000 12.766678 0.000000 17.471119 0.000000 26.880001 c
0.000000 45.119995 l
h
f
n
Q
q
1.000000 0.000000 -0.000000 1.000000 4.800003 16.799911 cm
1.000000 1.000000 1.000000 scn
17.280003 38.400082 m
17.187492 38.400082 l
15.922336 38.400127 14.830906 38.400166 13.931933 38.326714 c
12.983105 38.249191 12.039380 38.078033 11.131269 37.615330 c
9.776502 36.925041 8.675042 35.823582 7.984754 34.468811 c
7.522048 33.560703 7.350889 32.616978 7.273367 31.668148 c
7.199918 30.769175 7.199955 29.677742 7.199998 28.412586 c
7.200000 28.320076 l
7.200000 4.800079 l
1.200000 4.800079 l
0.537258 4.800079 0.000000 4.262821 0.000000 3.600079 c
0.000000 1.611855 1.611774 0.000080 3.599999 0.000080 c
7.200000 0.000080 l
9.600000 0.000080 l
52.800003 0.000080 l
55.200005 0.000080 l
58.800003 0.000080 l
60.788227 0.000080 62.400005 1.611855 62.400005 3.600079 c
62.400005 4.262821 61.862743 4.800079 61.200001 4.800079 c
55.200005 4.800079 l
55.200005 28.320080 l
55.200005 28.412533 l
55.200050 29.677713 55.200089 30.769163 55.126637 31.668148 c
55.049114 32.616978 54.877956 33.560703 54.415253 34.468811 c
53.724964 35.823582 52.623501 36.925041 51.268734 37.615330 c
50.360622 38.078033 49.416897 38.249191 48.468067 38.326714 c
47.569096 38.400166 46.477661 38.400127 45.212505 38.400082 c
45.119995 38.400082 l
17.280003 38.400082 l
h
50.400005 4.800079 m
50.400005 28.320080 l
50.400005 29.703808 50.398136 30.597267 50.342579 31.277275 c
50.289310 31.929268 50.198883 32.170994 50.138420 32.289658 c
49.908325 32.741249 49.541168 33.108402 49.089581 33.338497 c
48.970917 33.398960 48.729191 33.489388 48.077194 33.542656 c
47.397186 33.598213 46.503727 33.600082 45.119995 33.600082 c
17.280003 33.600082 l
15.896273 33.600082 15.002816 33.598213 14.322806 33.542656 c
13.670815 33.489388 13.429089 33.398960 13.310424 33.338497 c
12.858834 33.108402 12.491681 32.741249 12.261584 32.289658 c
12.201122 32.170994 12.110696 31.929268 12.057425 31.277275 c
12.001867 30.597263 12.000001 29.703808 12.000001 28.320076 c
12.000001 4.800079 l
50.400005 4.800079 l
h
f*
n
Q
endstream
endobj
3 0 obj
2940
endobj
4 0 obj
<< /Annots []
/Type /Page
/MediaBox [ 0.000000 0.000000 72.000000 72.000000 ]
/Resources 1 0 R
/Contents 2 0 R
/Parent 5 0 R
>>
endobj
5 0 obj
<< /Kids [ 4 0 R ]
/Count 1
/Type /Pages
>>
endobj
6 0 obj
<< /Type /Catalog
/Pages 5 0 R
>>
endobj
xref
0 7
0000000000 65535 f
0000000010 00000 n
0000000034 00000 n
0000003030 00000 n
0000003053 00000 n
0000003226 00000 n
0000003300 00000 n
trailer
<< /ID [ (some) (id) ]
/Root 6 0 R
/Size 7
>>
startxref
3359
%%EOF

View File

@ -0,0 +1,12 @@
{
"images" : [
{
"filename" : "ipad_30.pdf",
"idiom" : "universal"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

View File

@ -0,0 +1,225 @@
%PDF-1.7
1 0 obj
<< >>
endobj
2 0 obj
<< /Length 3 0 R >>
stream
/DeviceRGB CS
/DeviceRGB cs
q
1.000000 0.000000 -0.000000 1.000000 0.000000 0.000000 cm
0.000000 0.478431 1.000000 scn
0.000000 45.119995 m
0.000000 54.528881 0.000000 59.233322 1.831091 62.827042 c
3.441763 65.988159 6.011837 68.558235 9.172960 70.168907 c
12.766678 72.000000 17.471119 72.000000 26.880003 72.000000 c
45.119995 72.000000 l
54.528881 72.000000 59.233322 72.000000 62.827042 70.168907 c
65.988167 68.558235 68.558235 65.988159 70.168907 62.827042 c
72.000000 59.233322 72.000000 54.528881 72.000000 45.119995 c
72.000000 26.880005 l
72.000000 17.471119 72.000000 12.766678 70.168907 9.172958 c
68.558235 6.011833 65.988167 3.441765 62.827042 1.831093 c
59.233322 0.000000 54.528881 0.000000 45.119999 0.000000 c
26.880005 0.000000 l
17.471119 0.000000 12.766678 0.000000 9.172960 1.831093 c
6.011837 3.441765 3.441763 6.011833 1.831091 9.172958 c
0.000000 12.766678 0.000000 17.471119 0.000000 26.880001 c
0.000000 45.119995 l
h
f
n
Q
q
1.000000 0.000000 -0.000000 1.000000 16.800003 7.196266 cm
1.000000 1.000000 1.000000 scn
2.620846 5.326904 m
1.531268 3.188488 l
2.620846 5.326904 l
h
37.876831 7.424580 m
40.015247 6.335003 l
37.876831 7.424580 l
h
35.779156 5.326904 m
36.868732 3.188488 l
35.779156 5.326904 l
h
35.779156 52.280563 m
36.868732 54.418980 l
35.779156 52.280563 l
h
37.876831 50.182888 m
35.738419 49.093311 l
37.876831 50.182888 l
h
2.620846 52.280563 m
3.710423 50.142151 l
2.620846 52.280563 l
h
7.680000 50.403732 m
30.720007 50.403732 l
30.720007 55.203735 l
7.680000 55.203735 l
7.680000 50.403732 l
h
36.000000 45.123734 m
36.000000 12.483734 l
40.800003 12.483734 l
40.800003 45.123734 l
36.000000 45.123734 l
h
30.720001 7.203735 m
7.679995 7.203735 l
7.679995 2.403732 l
30.720001 2.403732 l
30.720001 7.203735 l
h
2.400000 12.483734 m
2.400000 45.123734 l
-2.400000 45.123734 l
-2.400000 12.483734 l
2.400000 12.483734 l
h
7.679995 7.203735 m
6.296269 7.203735 5.402813 7.205601 4.722805 7.261158 c
4.070815 7.314430 3.829088 7.404854 3.710423 7.465317 c
1.531268 3.188488 l
2.439379 2.725780 3.383104 2.554623 4.331932 2.477100 c
5.252741 2.401867 6.375473 2.403732 7.679995 2.403732 c
7.679995 7.203735 l
h
-2.400000 12.483734 m
-2.400000 11.179211 -2.401867 10.056477 -2.326633 9.135666 c
-2.249111 8.186840 -2.077953 7.243114 -1.615247 6.335003 c
2.661584 8.514156 l
2.601121 8.632820 2.510695 8.874550 2.457426 9.526539 c
2.401867 10.206551 2.400000 11.100006 2.400000 12.483734 c
-2.400000 12.483734 l
h
3.710423 7.465317 m
3.258834 7.695415 2.891680 8.062569 2.661584 8.514156 c
-1.615247 6.335003 l
-0.924959 4.980236 0.176501 3.878777 1.531268 3.188488 c
3.710423 7.465317 l
h
36.000000 12.483734 m
36.000000 11.100006 35.998135 10.206551 35.942577 9.526539 c
35.889305 8.874550 35.798882 8.632820 35.738419 8.514156 c
40.015247 6.335003 l
40.477955 7.243114 40.649113 8.186840 40.726635 9.135666 c
40.801868 10.056477 40.800003 11.179211 40.800003 12.483734 c
36.000000 12.483734 l
h
30.720001 2.403732 m
32.024525 2.403732 33.147259 2.401867 34.068069 2.477100 c
35.016895 2.554623 35.960621 2.725780 36.868732 3.188488 c
34.689579 7.465317 l
34.570915 7.404854 34.329185 7.314430 33.677197 7.261158 c
32.997185 7.205601 32.103729 7.203735 30.720001 7.203735 c
30.720001 2.403732 l
h
35.738419 8.514156 m
35.508320 8.062569 35.141167 7.695415 34.689579 7.465317 c
36.868732 3.188488 l
38.223499 3.878777 39.324959 4.980236 40.015247 6.335003 c
35.738419 8.514156 l
h
30.720007 50.403732 m
32.103733 50.403732 32.997189 50.401867 33.677197 50.346310 c
34.329185 50.293037 34.570911 50.202614 34.689579 50.142151 c
36.868732 54.418980 l
35.960621 54.881687 35.016899 55.052845 34.068069 55.130367 c
33.147259 55.205601 32.024529 55.203735 30.720007 55.203735 c
30.720007 50.403732 l
h
40.800003 45.123734 m
40.800003 46.428257 40.801868 47.550991 40.726635 48.471802 c
40.649113 49.420628 40.477955 50.364353 40.015247 51.272465 c
35.738419 49.093311 l
35.798882 48.974648 35.889305 48.732918 35.942577 48.080929 c
35.998135 47.400917 36.000000 46.507462 36.000000 45.123734 c
40.800003 45.123734 l
h
34.689579 50.142151 m
35.141167 49.912052 35.508320 49.544899 35.738419 49.093311 c
40.015247 51.272465 l
39.324959 52.627232 38.223499 53.728691 36.868732 54.418980 c
34.689579 50.142151 l
h
7.680000 55.203735 m
6.375476 55.203735 5.252744 55.205601 4.331933 55.130367 c
3.383105 55.052845 2.439379 54.881687 1.531268 54.418980 c
3.710423 50.142151 l
3.829088 50.202614 4.070814 50.293037 4.722806 50.346310 c
5.402816 50.401867 6.296272 50.403732 7.680000 50.403732 c
7.680000 55.203735 l
h
2.400000 45.123734 m
2.400000 46.507462 2.401867 47.400917 2.457426 48.080929 c
2.510695 48.732918 2.601121 48.974648 2.661584 49.093311 c
-1.615247 51.272465 l
-2.077953 50.364353 -2.249111 49.420628 -2.326633 48.471802 c
-2.401867 47.550991 -2.400000 46.428257 -2.400000 45.123734 c
2.400000 45.123734 l
h
1.531268 54.418980 m
0.176501 53.728691 -0.924959 52.627232 -1.615247 51.272465 c
2.661584 49.093311 l
2.891680 49.544899 3.258834 49.912052 3.710423 50.142151 c
1.531268 54.418980 l
h
f
n
Q
endstream
endobj
3 0 obj
5051
endobj
4 0 obj
<< /Annots []
/Type /Page
/MediaBox [ 0.000000 0.000000 72.000000 72.000000 ]
/Resources 1 0 R
/Contents 2 0 R
/Parent 5 0 R
>>
endobj
5 0 obj
<< /Kids [ 4 0 R ]
/Count 1
/Type /Pages
>>
endobj
6 0 obj
<< /Type /Catalog
/Pages 5 0 R
>>
endobj
xref
0 7
0000000000 65535 f
0000000010 00000 n
0000000034 00000 n
0000005141 00000 n
0000005164 00000 n
0000005337 00000 n
0000005411 00000 n
trailer
<< /ID [ (some) (id) ]
/Root 6 0 R
/Size 7
>>
startxref
5470
%%EOF

View File

@ -0,0 +1,12 @@
{
"images" : [
{
"filename" : "iphone_30.pdf",
"idiom" : "universal"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

View File

@ -0,0 +1,163 @@
%PDF-1.7
1 0 obj
<< >>
endobj
2 0 obj
<< /Length 3 0 R >>
stream
/DeviceRGB CS
/DeviceRGB cs
q
1.000000 0.000000 -0.000000 1.000000 0.000000 0.000000 cm
0.000000 0.478431 1.000000 scn
0.000000 45.119995 m
0.000000 54.528881 0.000000 59.233322 1.831091 62.827042 c
3.441763 65.988159 6.011837 68.558235 9.172960 70.168907 c
12.766678 72.000000 17.471119 72.000000 26.880003 72.000000 c
45.119995 72.000000 l
54.528881 72.000000 59.233322 72.000000 62.827042 70.168907 c
65.988167 68.558235 68.558235 65.988159 70.168907 62.827042 c
72.000000 59.233322 72.000000 54.528881 72.000000 45.119995 c
72.000000 26.880005 l
72.000000 17.471119 72.000000 12.766678 70.168907 9.172958 c
68.558235 6.011833 65.988167 3.441765 62.827042 1.831093 c
59.233322 0.000000 54.528881 0.000000 45.119999 0.000000 c
26.880005 0.000000 l
17.471119 0.000000 12.766678 0.000000 9.172960 1.831093 c
6.011837 3.441765 3.441763 6.011833 1.831091 9.172958 c
0.000000 12.766678 0.000000 17.471119 0.000000 26.880001 c
0.000000 45.119995 l
h
f
n
Q
q
1.000000 0.000000 -0.000000 1.000000 19.199997 9.599876 cm
1.000000 1.000000 1.000000 scn
10.080004 52.800121 m
9.987495 52.800121 l
9.436961 52.800140 8.919323 52.800159 8.436124 52.794121 c
8.344582 52.798107 8.252528 52.800121 8.160005 52.800121 c
7.200004 52.800121 l
7.200004 52.757835 l
7.038636 52.749306 6.882584 52.739063 6.731937 52.726753 c
5.783109 52.649231 4.839383 52.478073 3.931273 52.015369 c
2.576505 51.325081 1.475045 50.223621 0.784757 48.868851 c
0.322051 47.960743 0.150893 47.017017 0.073371 46.068188 c
-0.000078 45.169216 -0.000041 44.077785 0.000002 42.812630 c
0.000004 42.720119 l
0.000004 10.080120 l
0.000002 9.987610 l
-0.000041 8.722454 -0.000078 7.631023 0.073371 6.732052 c
0.150893 5.783222 0.322051 4.839497 0.784757 3.931385 c
1.475045 2.576618 2.576505 1.475159 3.931273 0.784870 c
4.839384 0.322166 5.783109 0.151009 6.731938 0.073486 c
7.630924 0.000034 8.722374 0.000072 9.987555 0.000118 c
10.080008 0.000118 l
23.520004 0.000118 l
23.612455 0.000118 l
24.877636 0.000072 25.969086 0.000034 26.868073 0.073486 c
27.816900 0.151009 28.760626 0.322166 29.668736 0.784870 c
31.023502 1.475159 32.124966 2.576618 32.815254 3.931385 c
33.277958 4.839497 33.449116 5.783222 33.526638 6.732052 c
33.600082 7.630951 33.600048 8.722282 33.600010 9.987305 c
33.600010 9.987579 l
33.600006 10.080120 l
33.600006 42.720119 l
33.600010 42.812660 l
33.600010 42.812935 l
33.600048 44.077961 33.600082 45.169289 33.526638 46.068188 c
33.449116 47.017017 33.277958 47.960743 32.815254 48.868851 c
32.124966 50.223621 31.023502 51.325081 29.668736 52.015369 c
28.760624 52.478073 27.816900 52.649231 26.868071 52.726753 c
26.717424 52.739063 26.561373 52.749306 26.400005 52.757835 c
26.400005 52.800121 l
25.440006 52.800121 l
25.347483 52.800121 25.255426 52.798107 25.163885 52.794121 c
24.680685 52.800159 24.163046 52.800140 23.612509 52.800121 c
23.520000 52.800121 l
10.080004 52.800121 l
h
8.314891 47.991890 m
7.843834 47.984375 7.457473 47.970039 7.122810 47.942696 c
6.470818 47.889427 6.229092 47.799000 6.110427 47.738537 c
5.658838 47.508442 5.291684 47.141289 5.061588 46.689697 c
5.001125 46.571033 4.910699 46.329308 4.857430 45.677315 c
4.801870 44.997303 4.800004 44.103848 4.800004 42.720119 c
4.800004 10.080120 l
4.800004 8.696392 4.801870 7.802933 4.857430 7.122925 c
4.910699 6.470932 5.001125 6.229206 5.061588 6.110542 c
5.291684 5.658951 5.658838 5.291798 6.110427 5.061703 c
6.229092 5.001240 6.470818 4.910812 7.122811 4.857544 c
7.802821 4.801983 8.696278 4.800117 10.080008 4.800117 c
23.520004 4.800117 l
24.903732 4.800117 25.797190 4.801983 26.477198 4.857544 c
27.129190 4.910812 27.370916 5.001240 27.489582 5.061703 c
27.941170 5.291798 28.308325 5.658951 28.538420 6.110542 c
28.598883 6.229206 28.689310 6.470932 28.742579 7.122925 c
28.798138 7.802933 28.800005 8.696392 28.800005 10.080120 c
28.800005 42.720119 l
28.800005 44.103851 28.798138 44.997307 28.742579 45.677315 c
28.689310 46.329308 28.598883 46.571033 28.538420 46.689697 c
28.308325 47.141289 27.941170 47.508442 27.489582 47.738537 c
27.370916 47.799000 27.129190 47.889427 26.477198 47.942696 c
26.142536 47.970039 25.756174 47.984375 25.285118 47.991890 c
24.562664 47.914627 24.000006 47.303085 24.000006 46.560120 c
24.000006 44.704445 22.495684 43.200119 20.640005 43.200119 c
12.960005 43.200119 l
11.104329 43.200119 9.600004 44.704445 9.600004 46.560120 c
9.600004 47.303085 9.037343 47.914627 8.314891 47.991890 c
h
f*
n
Q
endstream
endobj
3 0 obj
4420
endobj
4 0 obj
<< /Annots []
/Type /Page
/MediaBox [ 0.000000 0.000000 72.000000 72.000000 ]
/Resources 1 0 R
/Contents 2 0 R
/Parent 5 0 R
>>
endobj
5 0 obj
<< /Kids [ 4 0 R ]
/Count 1
/Type /Pages
>>
endobj
6 0 obj
<< /Type /Catalog
/Pages 5 0 R
>>
endobj
xref
0 7
0000000000 65535 f
0000000010 00000 n
0000000034 00000 n
0000004510 00000 n
0000004533 00000 n
0000004706 00000 n
0000004780 00000 n
trailer
<< /ID [ (some) (id) ]
/Root 6 0 R
/Size 7
>>
startxref
4839
%%EOF

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -1 +1 @@
{"v":"5.7.4","fr":60,"ip":0,"op":180,"w":30,"h":30,"nm":"safari_30","ddd":0,"assets":[],"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Com 2","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":10,"s":[0]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":30,"s":[185]},{"t":40,"s":[180]}],"ix":10},"p":{"a":0,"k":[15,15,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[16.667,16.667,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.15,0.205],[-0.233,0.543],[0,0],[0.142,0.444],[0.385,0.123],[1.435,-0.615],[0,0],[0.231,-0.17],[0.15,-0.205],[0.233,-0.543],[0,0],[-0.142,-0.444],[-0.385,-0.123],[-1.435,0.615],[0,0],[-0.231,0.17]],"o":[[0.17,-0.231],[0,0],[0.615,-1.435],[-0.123,-0.385],[-0.444,-0.142],[0,0],[-0.543,0.233],[-0.205,0.15],[-0.17,0.231],[0,0],[-0.615,1.435],[0.123,0.385],[0.444,0.142],[0,0],[0.543,-0.233],[0.205,-0.15]],"v":[[2.611,2.075],[3.13,1.029],[4.28,-1.654],[5.061,-4.251],[4.251,-5.061],[1.654,-4.28],[-1.029,-3.13],[-2.075,-2.611],[-2.611,-2.075],[-3.13,-1.029],[-4.28,1.654],[-5.061,4.251],[-4.251,5.061],[-1.654,4.28],[1.029,3.13],[2.075,2.611]],"c":true},"ix":2},"nm":"Контур 1","mn":"ADBE Vector Shape - Group","hd":false},{"d":1,"ty":"el","s":{"a":0,"k":[2.5,2.5],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Контур эллипса 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"mm","mm":3,"nm":"Объединить контуры 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0.478431373835,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Заливка 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[600,600],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Преобразовать"}],"nm":"Com 2","np":4,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":180,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"Com 1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[15,15,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[16.667,16.667,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[20,20],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Контур эллипса 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Заливка 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[600,600],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Преобразовать"}],"nm":"Com 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":180,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"Block","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[15,15,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[16.667,16.667,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.671,-1.317],[0,-3.92],[0,0],[-0.763,-1.497],[-1.317,-0.671],[-3.92,0],[0,0],[-1.497,0.763],[-0.671,1.317],[0,3.92],[0,0],[0.763,1.497],[1.317,0.671],[3.92,0],[0,0],[1.497,-0.763]],"o":[[-0.763,1.497],[0,0],[0,3.92],[0.671,1.317],[1.497,0.763],[0,0],[3.92,0],[1.317,-0.671],[0.763,-1.497],[0,0],[0,-3.92],[-0.671,-1.317],[-1.497,-0.763],[0,0],[-3.92,0],[-1.317,0.671]],"v":[[-14.237,-11.178],[-15,-3.8],[-15,3.8],[-14.237,11.178],[-11.178,14.237],[-3.8,15],[3.8,15],[11.178,14.237],[14.237,11.178],[15,3.8],[15,-3.8],[14.237,-11.178],[11.178,-14.237],[3.8,-15],[-3.8,-15],[-11.178,-14.237]],"c":true},"ix":2},"nm":"Контур 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0.478431373835,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Заливка 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[600,600],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Преобразовать"}],"nm":"Block","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":180,"st":0,"bm":0}],"markers":[]}
{"v":"5.7.4","fr":60,"ip":0,"op":180,"w":30,"h":30,"nm":"safari_30","ddd":0,"assets":[],"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Com 2","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":120,"s":[0]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":140,"s":[185]},{"t":150,"s":[180]}],"ix":10},"p":{"a":0,"k":[15,15,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[16.667,16.667,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.15,0.205],[-0.233,0.543],[0,0],[0.142,0.444],[0.385,0.123],[1.435,-0.615],[0,0],[0.231,-0.17],[0.15,-0.205],[0.233,-0.543],[0,0],[-0.142,-0.444],[-0.385,-0.123],[-1.435,0.615],[0,0],[-0.231,0.17]],"o":[[0.17,-0.231],[0,0],[0.615,-1.435],[-0.123,-0.385],[-0.444,-0.142],[0,0],[-0.543,0.233],[-0.205,0.15],[-0.17,0.231],[0,0],[-0.615,1.435],[0.123,0.385],[0.444,0.142],[0,0],[0.543,-0.233],[0.205,-0.15]],"v":[[2.611,2.075],[3.13,1.029],[4.28,-1.654],[5.061,-4.251],[4.251,-5.061],[1.654,-4.28],[-1.029,-3.13],[-2.075,-2.611],[-2.611,-2.075],[-3.13,-1.029],[-4.28,1.654],[-5.061,4.251],[-4.251,5.061],[-1.654,4.28],[1.029,3.13],[2.075,2.611]],"c":true},"ix":2},"nm":"Контур 1","mn":"ADBE Vector Shape - Group","hd":false},{"d":1,"ty":"el","s":{"a":0,"k":[2.5,2.5],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Контур эллипса 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"mm","mm":3,"nm":"Объединить контуры 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0.478431373835,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Заливка 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[600,600],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Преобразовать"}],"nm":"Com 2","np":4,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":290,"st":110,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"Com 1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[15,15,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[16.667,16.667,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[20,20],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Контур эллипса 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Заливка 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[600,600],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Преобразовать"}],"nm":"Com 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":290,"st":110,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"Block","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[15,15,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[16.667,16.667,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.671,-1.317],[0,-3.92],[0,0],[-0.763,-1.497],[-1.317,-0.671],[-3.92,0],[0,0],[-1.497,0.763],[-0.671,1.317],[0,3.92],[0,0],[0.763,1.497],[1.317,0.671],[3.92,0],[0,0],[1.497,-0.763]],"o":[[-0.763,1.497],[0,0],[0,3.92],[0.671,1.317],[1.497,0.763],[0,0],[3.92,0],[1.317,-0.671],[0.763,-1.497],[0,0],[0,-3.92],[-0.671,-1.317],[-1.497,-0.763],[0,0],[-3.92,0],[-1.317,0.671]],"v":[[-14.237,-11.178],[-15,-3.8],[-15,3.8],[-14.237,11.178],[-11.178,14.237],[-3.8,15],[3.8,15],[11.178,14.237],[14.237,11.178],[15,3.8],[15,-3.8],[14.237,-11.178],[11.178,-14.237],[3.8,-15],[-3.8,-15],[-11.178,-14.237]],"c":true},"ix":2},"nm":"Контур 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0.478431373835,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Заливка 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[600,600],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Преобразовать"}],"nm":"Block","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":290,"st":110,"bm":0}],"markers":[]}